home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / PROG / PASCAL / SPEED2 / SRC / LIB / PMEDITOR.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-10-11  |  125.3 KB  |  3,813 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. {$Z+}  {Inline strings}
  14.  
  15. USES PmTypes,PmObject,Dos,PmDialog,Crt;
  16.  
  17. CONST
  18.      CM_FIND        =200;  {Find}
  19.      CM_REPLACE     =201;  {Replace}
  20.      CM_GOTO        =202;  {Goto}
  21.      CM_SEARCHAGAIN =203;  {Search again}
  22.      CM_CUT         =204;  {Cut text}
  23.      CM_COPY        =205;  {Copy text}
  24.      CM_PASTE       =206;  {Paste text}
  25.      CM_UNDO        =207;  {Undo}
  26.      CM_REDO        =208;  {Redo}
  27.      CM_CONTEXTHELP =209;  {Context sensitive help}
  28.  
  29.      MaxEditors=32;          {Maximal editors to process}
  30.      InitialBuf=32768;       {starting buffer size for editing}
  31.      EditorMaxLines:WORD=28; {maximal editor lines for standard text}
  32.  
  33. VAR
  34.    CharWidth:LONGWORD;
  35.    CharHeight:LONGWORD;
  36.    SelectDrawColor,SelectBackColor:LONGINT;
  37.    ErrorDrawColor,ErrorBackColor:LONGINT;
  38.  
  39. TYPE
  40.      PSliderData=^SliderData;
  41.      SliderData=record
  42.                       scrollbottom:LONGWORD; { Scroll lower border  }
  43.                       scrolltop:LONGWORD;    { Scroll upper border  }
  44.                       viewarea:LONGWORD;     { View area of window  }
  45.                       intervall:WORD;        { Intervall of Slider  }
  46.                       acvalue:LONGWORD;      { actual Slider value  }
  47.                 end;
  48.  
  49.      PTextBuf=^TTextBuf;
  50.      TTextBuf=ARRAY[0..6553500] OF BYTE; {that should be enough ...}
  51.  
  52.      PEditor=^TEditor;  {Data structure for each editor}
  53.      TEditor=RECORD
  54.                    TextBuffer:PTextBuf; {Buffer to text}
  55.                    ScreenBuffer:ARRAY[0..60] OF String[250];
  56.                    TextLen:LONGWORD;    {Length of text +InitialBuf}
  57.                    TextLow:LONGWORD;    {Actual low position in text}
  58.                    TextHigh:LONGWORD;   {Actual high position in text}
  59.                    HSlider,VSlider:SliderData;
  60.                    CursorX,CursorY:LONGWORD; {Current cursor position}
  61.                    InsertMode:BOOLEAN;
  62.                    Title:String;
  63.                    Untitled:BOOLEAN;
  64.                    Modified:BOOLEAN;
  65.                    TextLines:LONGWORD;
  66.                    TextViewX,TextViewY:LONGWORD;
  67.                    SelectLineStart,SelectColumnStart:WORD;
  68.                    SelectLineEnd,SelectColumnEnd:WORD;
  69.                    SelectAnchorLine,SelectAnchorColumn:WORD;
  70.                    SelectLoAddr,SelectHiAddr:LONGWORD;
  71.                    FrameWin:HWND;  {Frame window handle}
  72.                    ChildWin:HWND;  {MDI Window handle}
  73.                    ErrorMode:BOOLEAN;
  74.                    ErrorStr:String;
  75.                    ErrorLine:WORD;
  76.                    ErrorCol:WORD;
  77.                    LastSearch:BYTE;
  78.                    LastSearchStr,LastReplStr:STRING;
  79.                    LastSearchOpt:WORD;
  80.              END;
  81.  
  82.  
  83.  
  84. TYPE TEditorApplication=OBJECT(TMDIApplication)
  85.                    EditorCount:WORD;
  86.                    UntitledCount:BYTE;
  87.                    Editors:ARRAY[0..MaxEditors] OF PEditor;
  88.                    StdExt:String;
  89.                    SafetyBufSize:WORD;
  90.                    NewEditorPtr:LONGWORD;
  91.                    EditorCol,EditorBackCol:LONGINT;
  92.                    CONSTRUCTOR Init;
  93.                    DESTRUCTOR Done;
  94.                    PROCEDURE SetEditorPtr(id,res:LONGWORD);VIRTUAL;
  95.                    PROCEDURE HandleCommand(Win:HWND;Command:WORD):VIRTUAL;
  96.                    FUNCTION MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,para2:POINTER;
  97.                                            VAR Handled:BOOLEAN;
  98.                                            Data:POINTER):LONGWORD:virtual;
  99.                    FUNCTION HandleEvent(Win:HWND;Msg:LONGWORD;
  100.                                         para1,para2:POINTER;
  101.                                         VAR Handled:BOOLEAN):
  102.                                         LONGWORD:VIRTUAL;
  103.                    PROCEDURE MDIRedraw(rc:RECTL;_hps:HPS;Win:HWND;Data:POINTER):virtual;
  104.                    PROCEDURE MDICreateNotify(MDIFrWin,MDIWin:HWND;Data:POINTER):virtual;
  105.                    PROCEDURE MDINoMoreChilds:VIRTUAL;
  106.                    PROCEDURE AppRunNotify(AppFrWin:HWND):VIRTUAL;
  107.                    FUNCTION CreateMDIChild(resid:LONGWORD;Title:string;
  108.                                            Extra:POINTER;fcfFlags:LONGWORD;
  109.                                            Col,BCol:LONGINT):HWND:VIRTUAL;
  110.                    PROCEDURE OpenNewFile;VIRTUAL;
  111.                    PROCEDURE OpenFile(name:STRING);VIRTUAL;
  112.                    PROCEDURE SaveFile;VIRTUAL;
  113.                    PROCEDURE SaveFileAs;VIRTUAL;
  114.                    PROCEDURE SaveAllFiles;VIRTUAL;
  115.                    PROCEDURE SaveEditor(e:PEditor);VIRTUAL;
  116.                    PROCEDURE InitEditor(e:Peditor);VIRTUAL;
  117.                    PROCEDURE CheckHScrollBar(Win:HWND;para1,para2,Extra:PEditor);VIRTUAL;
  118.                    PROCEDURE CheckVScrollBar(Win:HWND;para1,para2,Extra:PEditor);VIRTUAL;
  119.                    PROCEDURE MDIHandleCharEvent(Win:HWND;ch:Char;Data:POINTER):VIRTUAL;
  120.                    PROCEDURE MDIHandleScanEvent(Win:HWND;scan:Word;Data:POINTER):VIRTUAL;
  121.                    PROCEDURE WMMDIClose(Win:HWND;Data:POINTER):VIRTUAL;
  122.                    PROCEDURE SetCursor(Win:HWND;pp:PEditor);VIRTUAL;
  123.                    PROCEDURE InvalidateEditorLine(Win:HWND;VAR s:string;
  124.                                                   y:LONGWORD;Extra:PEditor);VIRTUAL;
  125.                    FUNCTION CheckIfToScrollX(Win:HWND;Extra:PEditor;
  126.                                              Update:BOOLEAN):BOOLEAN;VIRTUAL;
  127.                    PROCEDURE DestroyEditor(e:PEditor);VIRTUAL;
  128.                    PROCEDURE InvalidateEditorWindow(Win:HWND;Extra:PEditor);VIRTUAL;
  129.                    FUNCTION GetUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;VIRTUAL;
  130.                    FUNCTION GetLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;VIRTUAL;
  131.                    FUNCTION AppendUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;VIRTUAL;
  132.                    FUNCTION AppendLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;VIRTUAL;
  133.                    PROCEDURE LineDown(Win:HWND;Extra:PEditor;
  134.                                       CheckEmpty:BOOLEAN);VIRTUAL;
  135.                    FUNCTION PageDown(Win:HWND;Extra:PEditor):BOOLEAN;VIRTUAL;
  136.                    PROCEDURE LineUp(Win:HWND;Extra:PEditor);VIRTUAL;
  137.                    PROCEDURE PageUp(Win:HWND;Extra:PEditor);VIRTUAL;
  138.                    PROCEDURE GotoLine(Extra:PEditor;Line,Col:WORD);VIRTUAL;
  139.                    PROCEDURE SearchEditor(VAR s:String;VAR e:PEditor);VIRTUAL;
  140.                    PROCEDURE SetPosText(Win:HWND;Extra:PEditor);VIRTUAL;
  141.                    FUNCTION ErrorLineHandled(Win:HWND;pp:PEditor;
  142.                                              s:string):BOOLEAN;VIRTUAL;
  143.                    PROCEDURE ClearErrorLine(Win:HWND;pp:PEditor);VIRTUAL;
  144.                    PROCEDURE InsertText(Win:HWND;Extra:PEditor);VIRTUAL;
  145.                    PROCEDURE PutText(Win:HWND;Extra:PEditor;Buf:PTextBuf;
  146.                                      Len,CountLines:LONGWORD);VIRTUAL;
  147.                    PROCEDURE ExtendEditor(Extra:PEditor);VIRTUAL;
  148.                    PROCEDURE CopyEditor(e:PEditor;VAR Adresse,Len:LONGWORD);VIRTUAL;
  149.                    PROCEDURE ContextHelp(Context:String);VIRTUAL;
  150.                    PROCEDURE SetSliderValues(Win:HWND;Extra:PEditor);VIRTUAL;
  151.                    FUNCTION CutSelectedText(Win:HWND;Extra:PEditor;
  152.                                             VAR Len:LONGWORD):PTextBuf;VIRTUAL;
  153.                    FUNCTION CopySelectedText(Win:HWND;Extra:PEditor;
  154.                                              VAR Len:LONGWORD):PTextBuf;VIRTUAL;
  155.                    FUNCTION FindText(s:string;Options:WORD):BOOLEAN;VIRTUAL;
  156.                    FUNCTION ReplaceText(s,repl:string;Options:WORD):BOOLEAN;VIRTUAL;
  157.                    PROCEDURE GetEditorOptions(VAR Insert,Indent,SynHigh,BackUps:
  158.                                               BOOLEAN);VIRTUAL;
  159.                    PROCEDURE DrawEditorStr(VAR pchString;
  160.                                             lCount:LONGWORD;
  161.                                             VAR pptlPoint:POINTL;
  162.                                             _hps:HPS;DrawColor:LONGINT);VIRTUAL;
  163.                    PROCEDURE DrawHighLightedStr(VAR pchString:STRING;
  164.                                             lCount:LONGWORD;
  165.                                             VAR pptlPoint:POINTL;
  166.                                             _hps:HPS;DrawColor:LONGINT);VIRTUAL;
  167.                    PROCEDURE EditorStatusMessage(msg:STRING);VIRTUAL;
  168.                    PROCEDURE SetEditorTextHeight(h50:BOOLEAN);VIRTUAL;
  169.                    PROCEDURE MDIWMEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS):VIRTUAL;
  170.               END;
  171.  
  172.  
  173. IMPLEMENTATION
  174.  
  175. IMPORTS {Private}
  176.       FUNCTION WinSetWindowText(psztext:PSZ;
  177.                                 _hwnd:HWND):LONGWORD:   PMWIN index 877;
  178.       FUNCTION WinQueryWindow(cmd:LONGWORD;
  179.                                   _hwnd:HWND):LONGWORD:    PMWIN index 834;
  180.       FUNCTION WinWindowFromID(id:LONGWORD;
  181.                                    hwndParent:HWND):HWND:  PMWIN index 899;
  182.       FUNCTION WinSendMsg(MPARAM2,MPARAM1:POINTER;
  183.                               msg:LONGWORD;
  184.                               _hwnd:HWND):POINTER:         PMWIN index 920;
  185.       FUNCTION WinQueryWindowRect(VAR prclDest:RECTL;
  186.                                       _hwnd:HWND ):
  187.                                       LONGWORD:            PMWIN index 840;
  188.       PROCEDURE WinReleasePS(_hps:HPS):                    PMWIN index 848;
  189.       FUNCTION  WinGetPS(Win:HWND):HPS:                    PMWIN index 757;
  190.       PROCEDURE WinShowCursor(Visible:LONGWORD;
  191.                               Win:HWND):                   PMWIN index 880;
  192.       PROCEDURE GpiSetBackMix(Mix:LONGWORD;_hps:HPS):      PMGPI index 505;
  193.       FUNCTION GpiSetColor(lColor:LONGWORD;
  194.                              _hps:HPS):LONGINT:            PMGPI index 517;
  195.       FUNCTION GpiSetBackColor(lColor:LONGINT;
  196.                                _hps:HPS):LONGWORD:       PMGPI index 504;
  197.       FUNCTION GpiCharStringAt(VAR pchString;
  198.                                lCount:LONGWORD;
  199.                                VAR pptlPoint:POINTL;
  200.                                _hps:HPS):LONGWORD:       PMGPI index 359;
  201.       FUNCTION WinLoadPointer(id:LONGWORD;
  202.                               hmod:LONGWORD;
  203.                               Desktop:HWND):LONGWORD:    PMWIN index 780;
  204.       PROCEDURE WinDestroyPointer(hptr:LONGWORD):        PMWIN index 727;
  205.       PROCEDURE WinSetPointer(hptr:LONGWORD;
  206.                               Desktop:HWND):             PMWIN index 866;
  207.       FUNCTION DosAllocSharedMem(Flag,cb:LONGWORD;
  208.                                  Name:POINTER;
  209.                                  VAR p:POINTER):LONGWORD:DOSCALLS index 300;
  210.       FUNCTION WinOpenClipbrd(hab:LONGWORD):LONGWORD:    PMWin index 793;
  211.       FUNCTION WinCloseClipbrd(hab:LONGWORD):LONGWORD:    PMWin index 707;
  212.       FUNCTION WinEmptyClipbrd(hab:LONGWORD):LONGWORD:    PMWin index 733;
  213.       FUNCTION WinSetClipbrdData(FmtInfo,fmt:LONGWORD;
  214.                                  Data,hab:LONGWORD):LONGWORD:PMWin index 854;
  215.       FUNCTION WinQueryClipbrdData(fmt,hab:LONGWORD):POINTER:PMWin index 806;
  216.       FUNCTION WinMessageBox(flStyle:LONGWORD;
  217.                              idWindow:LONGWORD;
  218.                              pszCaption:PSZ;
  219.                              pszText:PSZ;
  220.                              hwndOwner:HWND;
  221.                              hwndParent:HWND):LONGWORD:        PMWIN index 789;
  222.       FUNCTION WinSetCapture(hwndDesktop,ahwnd:HWND):BOOL;
  223.                     APIENTRY;             PMWIN index 852;
  224. END;
  225.  
  226. CONST
  227.      PAG_READ         =$00000001; {* read access *}
  228.      PAG_WRITE        =$00000002; {* write access *}
  229.      PAG_EXECUTE      =$00000004; {* execute access *}
  230.      PAG_GUARD        =$00000008; {* guard protection *}
  231.      PAG_DEFAULT      =$00000400; {* default (initial) access *}
  232.  
  233.      CFI_POINTER      =$0400;
  234.      CF_TEXT          =1;
  235.  
  236. {* Commit *}
  237.  
  238. CONST
  239.      PAG_COMMIT       =$00000010; {* commit storage *}
  240.      PAG_DECOMMIT     =$00000020; {* decommit storage *}
  241.  
  242.  
  243. {* Allocation attributes *}
  244.  
  245. CONST
  246.      OBJ_TILE         =$00000040; {* tile object *}
  247.      OBJ_PROTECTED    =$00000080; {* protect object
  248.                                      NOTE: This flag is NOT available at
  249.                                      the api level *}
  250.      OBJ_GETTABLE     =$00000100; {* gettable by other processes      *}
  251.      OBJ_GIVEABLE     =$00000200; {* giveable to other processes      *}
  252.  
  253.  
  254. PROCEDURE TEditorApplication.MDIWMEraseBackGround(Win:HWND;rc:RECTL;_hps:HPS);
  255. BEGIN
  256.      Inherited.MDIWMEraseBackGround(Win,rc,_hps);
  257. END;
  258.  
  259. FUNCTION TEditorApplication.CreateMDIChild(resid:LONGWORD;Title:string;
  260.                                   Extra:POINTER;fcfFlags:LONGWORD;
  261.                                   Col,BCol:LONGINT):HWND;
  262. VAR res:HWND;
  263. BEGIN
  264.      res:=Inherited.CreateMDIChild(resid,Title,Extra,fcfFlags,Col,BCol);
  265.      IF res<>0 THEN
  266.      BEGIN
  267.           SetMenuState(CM_FIND,TRUE);
  268.           SetMenuState(CM_REPLACE,TRUE);
  269.           SetMenuState(CM_GOTO,TRUE);
  270.           SetMenuState(CM_SEARCHAGAIN,TRUE);
  271.           SetMenuState(CM_CUT,TRUE);
  272.           SetMenuState(CM_COPY,TRUE);
  273.           SetMenuState(CM_PASTE,TRUE);
  274.           SetMenuState(CM_UNDO,TRUE);
  275.           SetMenuState(CM_REDO,TRUE);
  276.      END;
  277.      CreateMDIChild:=res;
  278. END;
  279.  
  280. PROCEDURE TEditorApplication.MDINoMoreChilds;
  281. BEGIN
  282.      Inherited.MDINoMoreChilds;
  283.      SetMenuState(CM_FIND,FALSE);
  284.      SetMenuState(CM_REPLACE,FALSE);
  285.      SetMenuState(CM_GOTO,FALSE);
  286.      SetMenuState(CM_SEARCHAGAIN,FALSE);
  287.      SetMenuState(CM_CUT,FALSE);
  288.      SetMenuState(CM_COPY,FALSE);
  289.      SetMenuState(CM_PASTE,FALSE);
  290.      SetMenuState(CM_UNDO,FALSE);
  291.      SetMenuState(CM_REDO,FALSE);
  292. END;
  293.  
  294. PROCEDURE TEditorApplication.AppRunNotify(AppFrWin:HWND);
  295. BEGIN
  296.      Inherited.AppRunNotify(AppFrWin);
  297.      SetMenuState(CM_FIND,FALSE);
  298.      SetMenuState(CM_REPLACE,FALSE);
  299.      SetMenuState(CM_GOTO,FALSE);
  300.      SetMenuState(CM_SEARCHAGAIN,FALSE);
  301.      SetMenuState(CM_CUT,FALSE);
  302.      SetMenuState(CM_COPY,FALSE);
  303.      SetMenuState(CM_PASTE,FALSE);
  304.      SetMenuState(CM_UNDO,FALSE);
  305.      SetMenuState(CM_REDO,FALSE);
  306. END;
  307.  
  308.  
  309.  
  310.  
  311. PROCEDURE TEditorApplication.GetEditorOptions(VAR Insert,Indent,SynHigh,
  312.                                    BackUps:BOOLEAN);
  313. BEGIN
  314.      Indent:=FALSE; {Standard values}
  315.      Insert:=TRUE;
  316.      SynHigh:=FALSE;
  317.      BackUps:=TRUE;
  318. END;
  319.  
  320.  
  321. PROCEDURE TEditorApplication.SetEditorTextHeight(h50:BOOLEAN);
  322. VAR t,t1:BYTE;
  323.     e:PEditor;
  324. BEGIN
  325.      IF h50 THEN {50 Zeilen}
  326.      BEGIN
  327.           IF CharHeight=8 THEN exit;
  328.           CharHeight:=8;
  329.           CharWidth:=9;
  330.           EditorMaxLines:=60;
  331.           IF EditorCount>0 THEN
  332.           BEGIN
  333.               FOR t:=0 TO EditorCount-1 DO
  334.               BEGIN
  335.                    e:=Editors[t];
  336.                    FOR t1:=29 TO 60 DO GetUpperLine(e^.ScreenBuffer[t1],e);
  337.                    e^.CursorY:=1;
  338.                    SetSliderValues(e^.ChildWin,e);
  339.               END;
  340.           END;
  341.           TileWindows;
  342.      END
  343.      ELSE {25 Zeilen}
  344.      BEGIN
  345.           IF CharHeight=16 THEN exit;
  346.           CharHeight:=16;
  347.           CharWidth:=8;
  348.           EditorMaxLines:=28;
  349.           IF EditorCount>0 THEN
  350.           BEGIN
  351.               FOR t:=0 TO EditorCount-1 DO
  352.               BEGIN
  353.                    e:=Editors[t];
  354.                    FOR t1:=60 DOWNTO 29 DO AppendUpperLine(e^.ScreenBuffer[t1],e);
  355.                    e^.CursorY:=1;
  356.                    SetSliderValues(e^.ChildWin,e);
  357.               END;
  358.           END;
  359.           TileWindows;
  360.      END;
  361. END;
  362.  
  363. PROCEDURE TEditorApplication.EditorStatusMessage(msg:STRING);
  364. BEGIN
  365. END;
  366.  
  367. PROCEDURE TEditorApplication.DrawHighLightedStr(VAR pchString:STRING;
  368.                                                 lCount:LONGWORD;
  369.                                                 VAR pptlPoint:POINTL;
  370.                                                 _hps:HPS;DrawColor:LONGINT);
  371. BEGIN
  372.      GpiCharStringAt(pchString[1],lCount,pptlPoint,_hps);
  373. END;
  374.  
  375. PROCEDURE TEditorApplication.DrawEditorStr(VAR pchString;
  376.                                                 lCount:LONGWORD;
  377.                                                 VAR pptlPoint:POINTL;
  378.                                                 _hps:HPS;DrawColor:LONGINT);
  379. VAR Insert,Indent,SynHigh,BackUps:BOOLEAN;
  380.     s:STRING;
  381. BEGIN
  382.      IF lCount=0 THEN exit;
  383.      GetEditorOptions(Insert,Indent,SynHigh,BackUps);
  384.      IF SynHigh THEN
  385.      BEGIN
  386.           s[0]:=chr(lCount);
  387.           move(pchString,s[1],lCount);
  388.           s[lcount+1]:=#0;
  389.           s[lcount+2]:=#0;
  390.           DrawHighLightedStr(s,lCount,pptlPoint,_hps,DrawColor);
  391.      END
  392.      ELSE GpiCharStringAt(pchString,lCount,pptlPoint,_hps);
  393. END;
  394.  
  395. FUNCTION TEditorApplication.FindText(s:string;Options:WORD):BOOLEAN;
  396. VAR CaseSens:BOOLEAN;
  397.     t,t1:BYTE;
  398.     e:PEditor;
  399.     res:BOOLEAN;
  400.     OldLine:WORD;
  401.     OldColumn:WORD;
  402.     FoundPosX:WORD;
  403.     s1,s2:STRING;
  404. Label l,l1,l2;
  405. BEGIN
  406.      res:=FALSE;
  407.      IF Options AND 1=1 THEN CaseSens:=TRUE
  408.      ELSE
  409.      BEGIN
  410.           CaseSens:=FALSE;
  411.           FOR t:=1 TO length(s) DO s[t]:=upcase(s[t]);
  412.      END;
  413.      MDIGetTopWindow(e);
  414.      IF e=NIL THEN goto l;
  415.  
  416.      EditorStatusMessage('Find text:');
  417.      e^.LastSearch:=1;
  418.      e^.LastSearchStr:=s;
  419.      e^.LastSearchOpt:=Options;
  420.      OldLine:=e^.VSlider.acvalue+e^.CursorY;
  421.      OldColumn:=e^.HSlider.acvalue+e^.CursorY;
  422.      IF Options AND 2=0 THEN GotoLine(e,1,1);
  423.      {First look in the ScreenBuffer}
  424.      IF e^.CursorY>1 THEN FOR t:=0 TO e^.CursorY-2 DO
  425.      BEGIN
  426.           inc(e^.VSlider.acvalue);
  427.           AppendLowerLine(e^.ScreenBuffer[t],e);
  428.      END;
  429.      FOR t:=e^.CursorY-1 TO EditorMaxLines DO
  430.      BEGIN
  431.           s1:=e^.ScreenBuffer[t];
  432.           IF t=e^.CursorY-1 THEN IF e^.CursorX>1 THEN Delete(s1,1,e^.CursorX-1);
  433.           IF not CaseSens THEN FOR t1:=1 TO length(s1) DO s1[t1]:=upcase(s1[t1]);
  434.           IF pos(s,s1)<>0 THEN  {Item found}
  435.           BEGIN
  436.                FoundPosX:=pos(s,s1);
  437.                IF t=e^.CursorY-1 THEN IF e^.CursorX>0 THEN
  438.                  inc(FoundPosX,e^.CursorX-1);
  439.                FOR t1:=EditorMaxLines DOWNTO t DO
  440.                  AppendUpperLine(e^.ScreenBuffer[t1],e);
  441.                FOR t1:=0 TO EditorMaxLines DO
  442.                  GetUpperLine(e^.ScreenBuffer[t1],e);
  443.                res:=TRUE;
  444.                goto l;
  445.           END;
  446.           inc(e^.VSlider.acvalue);
  447.           AppendLowerLine(e^.ScreenBuffer[t],e);
  448.      END;
  449.      {Now search in upper editor section}
  450. l1:
  451.      IF not GetUpperLine(s1,e) THEN
  452.      BEGIN
  453.           FOR t:=EditorMaxLines DOWNTO 0 DO
  454.           BEGIN
  455.                dec(e^.VSLider.acvalue);
  456.                GetLowerLine(e^.ScreenBuffer[t],e);
  457.           END;
  458.           goto l;
  459.      END;
  460.      s2:=s1;
  461.      IF not CaseSens THEN FOR t1:=1 TO length(s1) DO s1[t1]:=upcase(s1[t1]);
  462.      IF pos(s,s1)<>0 THEN  {Item found}
  463.      BEGIN
  464.           FoundPosX:=pos(s,s1);
  465.           e^.ScreenBuffer[0]:=s2;
  466.           FOR t1:=1 TO EditorMaxLines DO GetUpperLine(e^.ScreenBuffer[t1],e);
  467.           res:=TRUE;
  468.           goto l;
  469.      END;
  470.      inc(e^.VSlider.acvalue);
  471.      AppendLowerLine(s2,e);
  472.      goto l1;
  473. l:
  474.      EditorStatusMessage('');
  475.      IF res THEN {found}
  476.      BEGIN
  477.           e^.CursorY:=2;
  478.           e^.CursorX:=FoundPosX+length(s);
  479.           e^.HSlider.acvalue:=0;
  480.           e^.SelectAnchorLine:=e^.VSlider.acvalue;
  481.           e^.SelectAnchorColumn:=FoundPosX;
  482.  
  483.           e^.SelectLineStart:=e^.SelectAnchorLine;
  484.           e^.SelectLineEnd:=e^.SelectLineStart;
  485.           e^.SelectColumnStart:=e^.SelectAnchorColumn;
  486.           e^.SelectColumnEnd:=e^.SelectColumnStart+length(s)-1;
  487.           e^.SelectLoAddr:=0;
  488.           e^.SelectHiAddr:=0;
  489.  
  490.           GotoLine(e,e^.SelectLineStart+1,e^.CursorX);
  491.      END
  492.      ELSE IF e<>NIL THEN GotoLine(e,OldLine,OldColumn);
  493. l2:
  494.      EditorStatusMessage('');
  495.      FindText:=res;
  496. END;
  497.  
  498. FUNCTION TEditorApplication.ReplaceText(s,repl:string;Options:WORD):BOOLEAN;
  499. Label l,l1;
  500. VAR res:BOOLEAN;
  501.     s1,msg:String;
  502.     result:LONGWORD;
  503.     e:PEditor;
  504. BEGIN
  505.      res:=TRUE;
  506.      MDIGetTopWindow(e);
  507.      IF e=NIL THEN goto l1;
  508. l:
  509.      res:=FALSE;
  510.      IF FindText(s,Options) THEN
  511.      BEGIN
  512.           e^.LastSearch:=2;
  513.           e^.LastSearchStr:=s;
  514.           e^.LastReplStr:=Repl;
  515.           e^.LastSearchOpt:=Options;
  516.           s1:='Replace text';
  517.           msg:='Replace this occurrence ?';
  518.           result:=WinMessageBox(MB_YESNOCANCEL or MB_MOVEABLE or MB_QUERY
  519.                                 or MB_ICONQUESTION,0,s1,
  520.                                 msg,AppWinFrameHandle,HWND_Desktop);
  521.           CASE result OF
  522.              MBID_YES:
  523.              BEGIN
  524.                   IF e^.CursorX>length(s) THEN
  525.                   BEGIN
  526.                       s1:=e^.ScreenBuffer[e^.CursorY-1];
  527.                       delete(s1,e^.CursorX-length(s),length(s));
  528.                       insert(Repl,s1,e^.CursorX-length(s));
  529.                       e^.ScreenBuffer[e^.CursorY-1]:=s1;
  530.                       e^.SelectColumnEnd:=e^.SelectColumnStart+length(repl)-1;
  531.                       e^.CursorX:=(e^.CursorX-length(s))+length(Repl);
  532.                       e^.Modified:=TRUE;
  533.                   END;
  534.              END;
  535.              MBID_CANCEL:
  536.              BEGIN
  537.                   res:=TRUE;
  538.                   goto l1;
  539.              END;
  540.           END; {case}
  541.           IF Options AND 4=4 THEN
  542.           BEGIN
  543.                Options:=Options OR 2; {From cursor}
  544.                goto l;
  545.           END
  546.           ELSE res:=TRUE;
  547.      END
  548.      ELSE  {Text not found}
  549.      BEGIN
  550.           e^.LastSearch:=2;
  551.           e^.LastSearchStr:=s;
  552.           e^.LastReplStr:=Repl;
  553.           e^.LastSearchOpt:=Options;
  554.      END;
  555. l1:
  556.      ReplaceText:=res;
  557. END;
  558.  
  559. PROCEDURE TEditorApplication.CopyEditor(e:PEditor;VAR Adresse,Len:LONGWORD);
  560. VAR
  561.    l,lLow,lHigh,l1:LONGWORD;
  562.    t:BYTE;
  563.    s:String;
  564.    p,source:^Byte;
  565. BEGIN
  566.      lLow:=e^.TextLow-LONGWORD(e^.TextBuffer);
  567.      l:=0;
  568.      FOR t:=0 TO EditorMaxLines DO
  569.      BEGIN
  570.           s:=e^.ScreenBuffer[t];
  571.           WHILE s[length(s)]=#32 do dec(s[0]);
  572.           l:=l+length(s)+2;
  573.      END;
  574.      l1:=LONGWORD(e^.TextBuffer)+e^.textlen;  {Maximal adress}
  575.      lHigh:=l1-e^.TextHigh;
  576.      IF lHigh>0 THEN dec(lHigh); {!!!}
  577.      Len:=LLow+LHigh+l; {Gesamtlänge}
  578.      Getmem(p,Len);
  579.      Adresse:=LONGWORD(p);
  580.  
  581.      IF lLow>0 THEN
  582.      BEGIN
  583.           source:=POINTER(e^.TextBuffer);
  584.           Move(source^,p^,lLow);
  585.           inc(p,LLow);
  586.      END;
  587.      FOR t:=0 TO EditorMaxLines DO
  588.      BEGIN
  589.           s:=e^.ScreenBuffer[t];
  590.           WHILE s[length(s)]=#32 do dec(s[0]);
  591.           s:=s+#13+#10;
  592.           move(s[1],p^,length(s));
  593.           inc(p,length(s));
  594.      END;
  595.      source:=POINTER(e^.TextHigh+1);
  596.      Move(Source^,p^,LHigh);
  597. END;
  598.  
  599. PROCEDURE TEditorApplication.SaveEditor(e:PEditor);
  600. VAR f:file;
  601.     d:dirstr;
  602.     n:namestr;
  603.     ex:extstr;
  604.     s,s1:String;
  605.     Buf:LONGWORD;
  606.     Len:LONGWORD;
  607.     t,t1:BYTE;
  608.     sp:PString;
  609.     Insert,Indent,SynHigh,Backups:BOOLEAN;
  610.     w:word;
  611.     Adresse,Max:LONGWORD;
  612. LABEL l,ex_this;
  613. BEGIN
  614.      IF e=NIL THEN exit;
  615.      IF e^.Untitled THEN
  616.      BEGIN
  617.           GetDir(0,s);
  618.           IF s[length(s)]='\' THEN dec(s[0]);
  619.           s:=s+'\'+e^.Title;
  620.           e^.Title:=s;
  621.           e^.Untitled:=FALSE;
  622.           sp:=s;
  623.           WinSetWindowText(sp,e^.FrameWin);
  624.      END;
  625.      EditorStatusMessage('Saving:'+e^.Title);
  626.      GetEditorOptions(Insert,Indent,SynHigh,BackUps);
  627.      IF Backups THEN
  628.      BEGIN
  629.           s:=e^.Title;
  630.           assign(f,s);
  631.           fsplit(s,d,n,ex);
  632.           IF d[length(d)]='\' THEN dec(d[0]);
  633.           s:=d+'\'+n+'.BAK';
  634.           Erase(s);  {Delete old .BAK file}
  635.           Rename(f,s);
  636.      END;
  637.      s:=e^.Title;
  638.      Assign(f,s);
  639.      Rewrite(f,1);
  640.      IF ioresult<>0 THEN
  641.      BEGIN
  642.           ErrorBox(MB_ICONHAND,'Could not create file (Disk full ?)');
  643.           EditorStatusMessage('');
  644.           exit;
  645.      END;
  646.      Buf:=LONGWORD(e^.TextBuffer);
  647.      Len:=e^.TextLow-Buf;
  648.      IF Len>0 THEN
  649.      BEGIN
  650.           BlockWrite(f,e^.TextBuffer^[0],Len);
  651.           IF ioresult<>0 THEN
  652.           BEGIN
  653.               ErrorBox(MB_ICONHAND,'Could not write file (Disk full ?)');
  654.               Close(f);
  655.               EditorStatusMessage('');
  656.               exit;
  657.           END;
  658.      END;
  659.  
  660.      FOR t:=0 TO EditorMaxLines DO
  661.      BEGIN
  662.           s:=e^.ScreenBuffer[t];
  663.           while s[length(s)]=#32 do dec(s[0]);
  664.           IF s='' THEN
  665.           BEGIN
  666.                Adresse:=e^.TextHigh;
  667.                Max:=LONGWORD(e^.TextBuffer)+e^.TextLen;
  668.                IF Adresse>=Max THEN  {No more lines in upper section}
  669.                BEGIN
  670.                     IF t=EditorMaxLines THEN goto ex_this;
  671.                     {Check if there are more not empty lines}
  672.                     FOR t1:=t+1 TO EditorMaxLines DO
  673.                     BEGIN
  674.                          s1:=e^.ScreenBuffer[t1];
  675.                          while s1[length(s1)]=#32 do dec(s1[0]);
  676.                          IF s1<>'' THEN goto l;  {still a line}
  677.                     END;
  678.                     {There are no more lines --> exit}
  679.                     goto ex_this;
  680.                END;
  681.           END;
  682. l:
  683.           s:=s+#13+#10;
  684.           BlockWrite(f,s[1],length(s));
  685.           IF ioresult<>0 THEN
  686.           BEGIN
  687.               ErrorBox(MB_ICONHAND,'Could not write file (Disk full ?)');
  688.               Close(f);
  689.               EditorStatusMessage('');
  690.               exit;
  691.           END;
  692.      END;
  693.  
  694.      Len:=Buf+e^.Textlen;  {Maximal adress}
  695.      Len:=Len-e^.TextHigh;
  696.      IF Len>0 THEN
  697.      BEGIN
  698.           BlockWrite(f,e^.TextBuffer^[e^.TextHigh-Buf],len);
  699.           IF ioresult<>0 THEN
  700.           BEGIN
  701.              ErrorBox(MB_ICONHAND,'Could not write file (Disk full ?)');
  702.              Close(f);
  703.              EditorStatusMessage('');
  704.              exit;
  705.           END;
  706.      END;
  707. ex_this:
  708.      Close(f);
  709.      IF ioresult<>0 THEN
  710.      BEGIN
  711.           ErrorBox(MB_ICONHAND,'Could not write file (Disk full ?)');
  712.           EditorStatusMessage('');
  713.           exit;
  714.      END;
  715.      e^.Modified:=FALSE;
  716.      EditorStatusMessage('');
  717. END;
  718.  
  719. PROCEDURE TEditorApplication.WMMDIClose(Win:HWND;Data:POINTER);
  720. VAR
  721.    e:PEditor;
  722.    name:Namestr;
  723.    dir:dirstr;
  724.    ext:extstr;
  725. BEGIN
  726.      e:=Data;
  727.      IF e^.Modified THEN
  728.      BEGIN
  729.        FSplit(e^.Title,dir,name,ext);
  730.        IF ConfirmBox(MB_ICONQUESTION,name+ext+' has been modified.'+#13+
  731.                      'Save ??') THEN SaveFile;
  732.      END;
  733.      Inherited.WMMDIClose(Win,Data);
  734. END;
  735.  
  736. PROCEDURE TEditorApplication.SaveFile;  {Save upper editor file}
  737. VAR e:PEditor;
  738.     s:string;
  739.     sp:PString;
  740.     f:file;
  741. LABEL l;
  742. BEGIN
  743.      IF EditorCount=0 THEN exit;
  744.      MDIGetTopWindow(e);
  745.      IF e=NIL THEN exit;
  746.      IF e^.Untitled THEN
  747.      BEGIN
  748. l:
  749.           IF FileSaveDialog(AppWinHandle,s) THEN
  750.           BEGIN
  751.                IF pos('.',s)=0 THEN s:=s+StdExt;
  752.                assign(f,s);
  753.                FileMode:=$40;  {fmInput}
  754.                reset(f,1);
  755.                FileMode:=$42;  {fmInOut}
  756.                IF ioresult=0 THEN  {file exists}
  757.                BEGIN
  758.                     Close(f);
  759.                     IF not ConfirmBox(MB_ICONQUESTION,'File exists. Overwrite ??')
  760.                       THEN goto l;
  761.                END;
  762.                e^.Title:=s;
  763.                e^.Untitled:=FALSE;
  764.                sp:=s;
  765.                WinSetWindowText(sp,e^.FrameWin);
  766.           END
  767.           ELSE exit; {Canceled}
  768.      END;
  769.      SaveEditor(e);
  770.      SetPosText(e^.FrameWin,e);
  771. END;
  772.  
  773. PROCEDURE TEditorApplication.SaveFileAs;  {Save upper editor file}
  774. VAR e:PEditor;
  775.     s:string;
  776.     sp:PString;
  777.     f:file;
  778. LABEL l;
  779. BEGIN
  780.      IF EditorCount=0 THEN exit;
  781.      MDIGetTopWindow(e);
  782.      IF e=NIL THEN exit;
  783. l:
  784.      IF FileSaveDialog(AppWinHandle,s) THEN
  785.      BEGIN
  786.           IF pos('.',s)=0 THEN s:=s+StdExt;
  787.           assign(f,s);
  788.           FileMode:=$40;  {fmInput}
  789.           reset(f,1);
  790.           FileMode:=$42;  {fmInOut}
  791.           IF ioresult=0 THEN  {file exists}
  792.           BEGIN
  793.                Close(f);
  794.                IF not ConfirmBox(MB_ICONQUESTION,'File exists. Overwrite ??')
  795.                  THEN goto l;
  796.           END;
  797.           e^.Title:=s;
  798.           e^.Untitled:=FALSE;
  799.           sp:=s;
  800.           WinSetWindowText(sp,e^.FrameWin);
  801.      END
  802.      ELSE exit; {Canceled}
  803.      SaveEditor(e);
  804.      SetPosText(e^.FrameWin,e);
  805. END;
  806.  
  807. PROCEDURE TEditorApplication.SaveAllFiles;
  808. VAR t:BYTE;
  809.     e:PEditor;
  810.     s:STRING;
  811.     sp:PString;
  812.     F:FILE;
  813. LABEL l,l1;
  814. BEGIN
  815.      IF EditorCount=0 THEN exit;
  816.      FOR t:=0 TO EditorCount-1 DO
  817.      BEGIN
  818.           e:=Editors[t];
  819.           IF e^.Modified THEN
  820.           BEGIN
  821.                IF e^.Untitled THEN
  822.                BEGIN
  823. l:
  824.                    IF FileSaveDialog(AppWinHandle,s) THEN
  825.                    BEGIN
  826.                        IF pos('.',s)=0 THEN s:=s+StdExt;
  827.                        assign(f,s);
  828.                        FileMode:=$40;  {fmInput}
  829.                        reset(f,1);
  830.                        FileMode:=$42;  {fmInOut}
  831.                        IF ioresult=0 THEN  {file exists}
  832.                        BEGIN
  833.                             Close(f);
  834.                             IF not ConfirmBox(MB_ICONQUESTION,'File exists. Overwrite ??')
  835.                              THEN goto l;
  836.                        END;
  837.                    END
  838.                    ELSE goto l1;  {Canceled}
  839.                    e^.Title:=s;
  840.                    e^.Untitled:=FALSE;
  841.                    sp:=s;
  842.                    WinSetWindowText(sp,e^.FrameWin);
  843.                END; {not untitled}
  844.                SaveEditor(e);
  845.                SetPosText(e^.FrameWin,e);
  846. l1:
  847.           END; {not modified}
  848.      END; {for}
  849. END;
  850.  
  851.  
  852. PROCEDURE TEditorApplication.SearchEditor(VAR s:String;VAR e:PEditor);
  853. VAR t:BYTE;
  854. BEGIN
  855.      e:=NIL;
  856.      IF EditorCount=0 THEN exit;
  857.      FOR t:=0 TO EditorCount-1 DO
  858.        IF Editors[t]^.Title=s THEN e:=Editors[t];
  859. END;
  860.  
  861.  
  862. FUNCTION CalcMaxSliderPositions(VAR scrolldata:SliderData):WORD;
  863. VAR as:WORD;
  864. BEGIN
  865.      as:=(scrolldata.scrolltop-scrolldata.scrollbottom)-scrolldata.viewarea;
  866.      inc(as,2);
  867.      scrolldata.intervall:=as;
  868.      CalcMaxSliderPositions:=as;
  869. END;
  870.  
  871. FUNCTION CalcSliderfromValue(wert:LONGWORD;scrolldata:SliderData):WORD;
  872. VAR og:LONGWORD;
  873.     rec:RECTL;
  874. BEGIN
  875.      og:=(scrolldata.scrolltop-scrolldata.viewarea)+1;
  876.      IF wert<scrolldata.scrollbottom THEN wert:=scrolldata.scrollbottom;
  877.      IF wert>og THEN wert:=og;
  878.      CalcSliderfromValue:=(wert-scrolldata.scrollbottom)+1;
  879. END;
  880.  
  881. FUNCTION CalcValuefromSlider(Wert:WORD;scrolldata:SliderData):
  882.          LONGWORD;
  883. VAR og:WORD;
  884. BEGIN
  885.      og:=(scrolldata.scrolltop-scrolldata.scrollbottom)-scrolldata.viewarea;
  886.      inc(og,2);
  887.      IF Wert<1 THEN Wert:=1;
  888.      IF Wert>og THEN Wert:=og;
  889.      CalcValuefromSlider:=(Wert+scrolldata.scrollbottom)-1;
  890. END;
  891.  
  892.  
  893. FUNCTION TEditorApplication.GetUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
  894. VAR Adresse:LONGWORD;
  895.     Buffer:POINTER;
  896.     Max:LONGWORD;
  897.     result:BOOLEAN;
  898. Label l;
  899. BEGIN
  900.      Adresse:=Extra^.TextHigh+1;
  901.      Max:=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen;
  902.      IF Adresse>=Max THEN
  903.      BEGIN
  904.           Extra^.TextHigh:=Max;
  905.           s:='';
  906.           result:=FALSE;
  907.           goto l;
  908.      END;
  909.      Buffer:=Extra^.TextBuffer;
  910.      ASM
  911.         MOV CL,0
  912.         MOV EDI,$s
  913.         INC EDI
  914.         MOV ESI,$Adresse
  915. !rep_lab:
  916.         CMP ESI,$Max
  917.         JAE !crlf
  918.         MOV AL,[ESI+0]
  919.         INC ESI
  920.         CMP AL,13
  921.         JE !cr
  922.         CMP AL,10
  923.         JE !crlf
  924.  
  925.         INC CL
  926.         MOV [EDI+0],AL
  927.         INC EDI
  928.         CMP CL,251
  929.         JAE !crlf
  930.         JMP !rep_lab
  931. !cr:
  932.         MOV AL,[ESI+0]
  933.         CMP AL,10
  934.         JNE !crlf
  935.         INC ESI
  936. !crlf:
  937.         CLD
  938.         MOV AL,0
  939.         STOSB
  940.         MOV EDI,$s
  941.         MOV [EDI+0],CL   ;Set text len
  942.         DEC ESI
  943.         CMP ESI,$Max
  944.         JBE !ok1
  945.         MOV ESI,$Max
  946. !ok1:
  947.         MOV $Adresse,ESI
  948.      END;
  949.      Extra^.TextHigh:=Adresse;
  950.      result:=TRUE;
  951. l:
  952.      IF length(s)>250 THEN s[0]:=#250;
  953.      ASM
  954.         MOV EDI,$s
  955.         MOV AL,[EDI+0]
  956.         CMP AL,250
  957.         JE !eee
  958.         ;Length to short --> fill up with space
  959.         MOVZX EAX,AL
  960.         MOVB [EDI+0],250
  961.         ADD EDI,EAX
  962.         INC EDI
  963.         MOV ECX,250
  964.         SUB ECX,EAX
  965.         MOV AL,32
  966.         CLD
  967.         REP
  968.         STOSB
  969.         MOV AL,0
  970.         STOSB
  971. !eee:
  972.      END;
  973.      GetUpperLine:=result;
  974. END;
  975.  
  976. FUNCTION TEditorApplication.GetLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
  977. VAR Adresse:LONGWORD;
  978.     Buffer:POINTER;
  979.     Result:BOOLEAN;
  980. Label l;
  981. BEGIN
  982.      Adresse:=Extra^.TextLow;
  983.      Buffer:=Extra^.TextBuffer;
  984.      IF Adresse<=LONGWORD(Buffer) THEN
  985.      BEGIN
  986.           Extra^.TextLow:=LONGWORD(Buffer);
  987.           Result:=FALSE;
  988.           s:='';
  989.           goto l;
  990.      END;
  991.      ASM
  992.          MOV CL,0
  993.          MOV EDI,$s
  994.          INC EDI
  995.          MOV ESI,$Adresse
  996.          SUB ESI,3
  997. !rep_lab1:
  998.          CMP ESI,$Buffer
  999.          JB !cr1
  1000.          CMP CL,251
  1001.          JAE !cr1
  1002.          MOV AL,[ESI+0]
  1003.          CMP AL,10
  1004.          JE !cr1
  1005.          CMP AL,13
  1006.          JE !cr1
  1007.          DEC ESI
  1008.          INC CL
  1009.          JMP !rep_lab1
  1010. !cr1:
  1011.          INC ESI
  1012.          MOVZX ECX,CL
  1013.          PUSH ECX
  1014.          PUSH ESI
  1015.          CMP ECX,0
  1016.          JE !no_copy
  1017.          CLD
  1018.          REP
  1019.          MOVSB
  1020. !no_copy:
  1021.          CLD
  1022.          MOV AL,0
  1023.          STOSB
  1024.          POP ESI
  1025.          POP ECX
  1026.          MOV EDI,$s
  1027.          MOV [EDI+0],CL
  1028.          CMP ESI,$Buffer
  1029.          JAE !ok
  1030.          MOV ESI,$Buffer
  1031. !ok:
  1032.          MOV $Adresse,ESI
  1033.      END;
  1034.      Extra^.TextLow:=Adresse;
  1035.      Result:=TRUE;
  1036. l:
  1037.      IF length(s)>250 THEN s[0]:=#250;
  1038.      ASM
  1039.         MOV EDI,$s
  1040.         MOV AL,[EDI+0]
  1041.         CMP AL,250
  1042.         JE !eee1
  1043.         ;Length to short --> fill up with space
  1044.         MOVZX EAX,AL
  1045.         MOVB [EDI+0],250
  1046.         ADD EDI,EAX
  1047.         INC EDI
  1048.         MOV ECX,250
  1049.         SUB ECX,EAX
  1050.         MOV AL,32
  1051.         CLD
  1052.         REP
  1053.         STOSB
  1054.         MOV AL,0
  1055.         STOSB
  1056. !eee1:
  1057.      END;
  1058.      GetLowerLine:=Result;
  1059. END;
  1060.  
  1061. PROCEDURE TEditorApplication.ExtendEditor(Extra:PEditor);  {grow up Editor and set
  1062.                                                             limits}
  1063. BEGIN
  1064.      Messagebox('Must extend editor !!');
  1065. END;
  1066.  
  1067. FUNCTION TEditorApplication.AppendUpperLine(VAR s:string;Extra:PEditor):BOOLEAN;
  1068. VAR Adresse,Max:LONGWORD;
  1069.     Buffer:POINTER;
  1070. Label l;
  1071. BEGIN
  1072.      WHILE s[length(s)]=#32 DO dec(s[0]);
  1073.      Adresse:=Extra^.TextHigh;
  1074.      Max:=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen;
  1075.      IF s='' THEN IF Adresse>=Max THEN goto l;
  1076.      IF Extra^.TextHigh-Extra^.TextLow<SafetyBufSize THEN ExtendEditor(Extra);
  1077.      Buffer:=Extra^.TextBuffer;
  1078.      ASM
  1079.          MOV EDI,$Adresse
  1080.          MOV AL,10
  1081.          STD
  1082.          STOSB
  1083.          MOV AL,13
  1084.          STOSB
  1085.          MOV ESI,$s
  1086.          MOV CL,[ESI+0]
  1087.          MOVZX ECX,CL
  1088.          ADD ESI,ECX
  1089.          CMP ECX,0
  1090.          JE !no_copy1
  1091.          STD
  1092.          REP
  1093.          MOVSB
  1094. !no_copy1:
  1095.          MOV $Adresse,EDI
  1096.      END;
  1097.      Extra^.TextHigh:=Adresse;
  1098. l:
  1099.      AppendUpperLine:=TRUE;
  1100. END;
  1101.  
  1102. FUNCTION TEditorApplication.AppendLowerLine(VAR s:string;Extra:PEditor):BOOLEAN;
  1103. VAR Adresse:LONGWORD;
  1104.     Buffer:POINTER;
  1105. BEGIN
  1106.      WHILE s[length(s)]=#32 DO dec(s[0]);
  1107.      IF Extra^.TextHigh-Extra^.TextLow<SafetyBufSize THEN ExtendEditor(Extra);
  1108.      Adresse:=Extra^.TextLow;
  1109.      Buffer:=Extra^.TextBuffer;
  1110.      ASM
  1111.         MOV EDI,$Adresse
  1112.         MOV ESI,$s
  1113.         MOV CL,[ESI+0]
  1114.         MOVZX ECX,CL
  1115.         INC ESI
  1116.         CMP ECX,0
  1117.         JE !no_copy2
  1118.         CLD
  1119.         REP
  1120.         MOVSB
  1121. !no_copy2:
  1122.         MOV AL,13
  1123.         STOSB
  1124.         MOV AL,10
  1125.         STOSB
  1126.         MOV $Adresse,EDI
  1127.      END;
  1128.      Extra^.TextLow:=Adresse;
  1129.      AppendLowerLine:=TRUE;
  1130. END;
  1131.  
  1132. PROCEDURE TEditorApplication.SetEditorPtr(id,res:LONGWORD);
  1133. VAR Ptr:LONGWORD;
  1134. BEGIN
  1135.      Ptr:=WinLoadPointer(id,res,HWND_DESKTOP);
  1136.      IF Ptr<>0 THEN NewEditorPtr:=Ptr;
  1137. END;
  1138.  
  1139. CONSTRUCTOR TEditorApplication.Init;
  1140. VAR t:WORD;
  1141. BEGIN
  1142.      inherited.Init;
  1143.      EditorCol:=CLR_YELLOW;
  1144.      EditorBackCol:=CLR_DARKBLUE;
  1145.      NewEditorPtr:=0;
  1146.      SelectBackColor:=15; {CLR_PALEGRAY}
  1147.      SelectDrawColor:=1; {CLR_BLUE}
  1148.      ErrorDrawColor:=15; {CLR_PALEGRAY}
  1149.      ErrorBackColor:=2;  {CLR_RED}
  1150.      StdExt:='.TXT';
  1151.      EditorCount:=0;
  1152.      UntitledCount:=0;
  1153.      CharHeight:=16;
  1154.      CharWidth:=8;
  1155.      SafetyBufSize:=768; {Minimum of 768 Bytes between Texthigh and TextLow}
  1156.      FOR t:=0 TO MaxEditors DO Editors[t]:=NIL;
  1157. END;
  1158.  
  1159. DESTRUCTOR TEditorApplication.Done;
  1160. BEGIN
  1161. END;
  1162.  
  1163. PROCEDURE TEditorApplication.DestroyEditor(e:PEditor);
  1164. VAR t,t1:WORD;
  1165. label l;
  1166. BEGIN
  1167.      freemem(e^.TextBuffer,e^.TextLen);
  1168.      FOR t:=0 TO MaxEditors DO IF Editors[t]=e THEN goto l;
  1169.      Errorbox(MB_ICONHAND,'FATAL:Could not free editor data !');
  1170.      exit;
  1171. l:
  1172.      FOR t1:=t TO MaxEditors DO Editors[t1]:=Editors[t1+1];
  1173.      dec(EditorCount);
  1174.      dispose(e);
  1175. END;
  1176.  
  1177. PROCEDURE TEditorApplication.InitEditor(e:Peditor);
  1178. VAR Adresse:LONGWORD;
  1179.     Max:LONGWORD;
  1180.     Insert,Indent,BackUps,SynHigh:BOOLEAN;
  1181. BEGIN
  1182.      Editors[EditorCount]:=e;
  1183.      inc(EditorCount);
  1184.      e^.CursorX:=1;
  1185.      e^.CursorY:=1;
  1186.      e^.HSlider.AcValue:=0;
  1187.      e^.VSlider.AcValue:=0;
  1188.      GetEditorOptions(Insert,Indent,SynHigh,BackUps);
  1189.      IF Insert THEN e^.InsertMode:=FALSE
  1190.      ELSE e^.InsertMode:=TRUE;
  1191.      e^.LastSearch:=0;
  1192.      e^.Untitled:=FALSE;
  1193.      e^.Modified:=FALSE;
  1194.      e^.SelectLineStart:=65535;
  1195.      e^.SelectLineEnd:=65535;
  1196.      e^.SelectColumnStart:=65535;
  1197.      e^.SelectColumnEnd:=65535;
  1198.      e^.SelectLoAddr:=0;
  1199.      e^.SelectHiAddr:=0;
  1200.      e^.ErrorMode:=FALSE;
  1201.      {Adresse:=e^.TextHigh;
  1202.      Max:=EditorMaxLines*2;
  1203.      ASM
  1204.         MOV ECX,$Max
  1205.         MOV EDI,$Adresse
  1206.         STD
  1207. !cploop:
  1208.         MOV AL,10
  1209.         STOSB
  1210.         MOV AL,13
  1211.         STOSB
  1212.         LOOP !cploop
  1213.         CLD
  1214.         MOV $Adresse,EDI
  1215.      END;
  1216.      e^.TextHigh:=Adresse;}
  1217. END;
  1218.  
  1219. PROCEDURE TEditorApplication.OpenNewFile;
  1220. VAR e:PEditor;
  1221.     t:WORD;
  1222.     s:string;
  1223.     fr:LONGWORD;
  1224. BEGIN
  1225.       IF EditorCount>=MaxEditors THEN
  1226.       BEGIN
  1227.            ErrorBox(MB_ICONHAND,'Too much files opened');
  1228.            exit;
  1229.       END;
  1230.       new(e);
  1231.       getmem(e^.TextBuffer,InitialBuf); {reserve 32K initially}
  1232.       e^.Textlen:=InitialBuf;
  1233.       e^.TextLow:=LONGWORD(e^.TextBuffer);
  1234.       e^.TextHigh:=e^.TextLow+e^.textLen;  {Clear Editor}
  1235.       e^.TextLines:=EditorMaxLines;
  1236.       InitEditor(e);
  1237.       FOR t:=0 TO EditorMaxLines DO
  1238.       BEGIN
  1239.            e^.ScreenBuffer[t]:='';
  1240.            s:=e^.ScreenBuffer[t];
  1241.            ASM
  1242.               CLD
  1243.               LEA EDI,$s
  1244.               MOV AL,250
  1245.               STOSB
  1246.               MOV ECX,250
  1247.               MOV AL,32
  1248.               REP
  1249.               STOSB
  1250.            END;
  1251.            e^.ScreenBuffer[t]:=s;
  1252.       END;
  1253.       s:=Tostr(UntitledCount);
  1254.       inc(UntitledCount);
  1255.       IF length(s)=1 THEN s:='0'+s;
  1256.       e^.Title:='NONAME'+s+StdExt;
  1257.       e^.untitled:=TRUE;
  1258.       fr:=FCF_VERTSCROLL or FCF_HORZSCROLL;
  1259.       IF ChildIconRes<>0 THEN fr:=fr or FCF_ICON;
  1260.       e^.FrameWin:=CreateMDIChild(ChildIconRes,e^.Title,e,fr,EditorCol,
  1261.                                   EditorBackCol);
  1262. END;
  1263.  
  1264. PROCEDURE TEditorApplication.OpenFile(name:string);
  1265. VAR e:PEditor;
  1266.     t:WORD;
  1267.     f:file;
  1268.     size:LONGWORD;
  1269.     Adresse:LONGWORD;
  1270.     Zeilen:LONGWORD;
  1271.     BufAdresse:LONGWORD;
  1272.     BufLen:LONGWORD;
  1273.     fr:LONGWORD;
  1274. LABEL l;
  1275. BEGIN
  1276.       SearchEditor(name,e);
  1277.       IF e<>NIL THEN {file already loaded}
  1278.       BEGIN
  1279.            MDIBringToTop(e^.FrameWin);
  1280.            exit;
  1281.       END;
  1282.  
  1283.       IF EditorCount>=MaxEditors THEN
  1284.       BEGIN
  1285.            ErrorBox(MB_ICONHAND,'Too much files opened');
  1286.            exit;
  1287.       END;
  1288.  
  1289.       EditorStatusMessage('Loading:'+name);
  1290.       assign(f,name);
  1291.       FileMode:=$40;  {fmInput}
  1292.       reset(f,1);
  1293.       FileMode:=$42;  {fmInOut}
  1294.       if ioresult<>0 THEN
  1295.       BEGIN
  1296.            ErrorBox(MB_ICONHAND,'Error reading:'+name);
  1297.            EditorStatusMessage('');
  1298.            exit;
  1299.       END;
  1300.       size:=FileSize(f);
  1301.       new(e);
  1302.       getmem(e^.TextBuffer,InitialBuf+size); {reserve 32K initially}
  1303.       e^.Textlen:=InitialBuf+size;
  1304.       e^.TextLow:=LONGWORD(e^.TextBuffer);
  1305.       e^.TextHigh:=e^.TextLow+e^.TextLen;  {Clear Editor}
  1306.       e^.TextLines:=EditorMaxLines;
  1307.       InitEditor(e);
  1308.       dec(e^.TextHigh,size+3);  {2 Byte for CR+LF}
  1309.       Adresse:=e^.TextHigh+1;
  1310.       ASM
  1311.          LEA EAX,$f
  1312.          PUSH EAX
  1313.          PUSHL $Adresse
  1314.          PUSHL $Size
  1315.          CALLN32 System._BlockRead
  1316.       END;
  1317.       IF ioresult<>0 THEN
  1318.       BEGIN
  1319. l:
  1320.            close(f);
  1321.            freemem(e^.TextBuffer,InitialBuf+size);
  1322.            EditorStatusMessage('');
  1323.            ErrorBox(MB_ICONHAND,'Error reading:'+name);
  1324.            exit;
  1325.       END
  1326.       ELSE IF Size<>BlockReadResult THEN goto l;
  1327.       close(f);
  1328.       ASM
  1329.          MOV EDI,$Adresse
  1330.          ADD EDI,$Size
  1331.          MOVB [EDI+0],13
  1332.          MOVB [EDI+1],10
  1333.       END;
  1334.       {Count Zeilnums}
  1335.       Zeilen:=0;
  1336.       BufAdresse:=e^.TextHigh+1;
  1337.       BufLen:=e^.TextLow+InitialBuf+size;
  1338.       ASM
  1339.          MOV ESI,$BufAdresse
  1340.          CLD
  1341. !cloop:
  1342.          CMP ESI,$BufLen
  1343.          JAE !zexit
  1344.          LODSB
  1345.          CMP AL,13
  1346.          JE !zfoundcr
  1347.          CMP AL,10
  1348.          JE !zFound
  1349.          JMP !cloop
  1350. !zfoundcr:
  1351.          LODSB
  1352.          CMP AL,10
  1353.          JE !zfound
  1354.          DEC ESI
  1355. !zfound:
  1356.          INCD $Zeilen
  1357.          JMP !cloop
  1358. !zexit:
  1359.       END;
  1360.       e^.TextLines:=Zeilen;
  1361.       FOR t:=0 TO EditorMaxLines DO GetUpperLine(e^.ScreenBuffer[t],e);
  1362.       e^.Title:=name;
  1363.       fr:=FCF_VERTSCROLL or FCF_HORZSCROLL;
  1364.       IF ChildIconRes<>0 THEN fr:=fr OR FCF_ICON;
  1365.       e^.FrameWin:=CreateMDIChild(ChildIconRes,e^.Title,e,fr,EditorCol,
  1366.                                   EditorBackCol);
  1367.       EditorStatusMessage('');
  1368. END;
  1369.  
  1370. FUNCTION TEditorApplication.CopySelectedText(Win:HWND;Extra:PEditor;
  1371.                          VAR Len:LONGWORD):PTextBuf;
  1372. VAR
  1373.    CountSelectedLines:WORD;
  1374.    SelEnd,SelStart:WORD;
  1375.    t:LONGWORD;
  1376.    dest,sourc:^Byte;
  1377.    p:PTextBuf;
  1378.    s:string;
  1379.    SelLowLen,SelHighLen:LONGWORD;
  1380. label l,l1,l2;
  1381. BEGIN
  1382.      p:=NIL;
  1383.      Len:=0;
  1384.      IF Extra^.SelectLineStart=65535 THEN goto l;
  1385.      IF Extra^.SelectLineEnd=65535 THEN goto l;
  1386.      CountSelectedLines:=(Extra^.SelectLineEnd-Extra^.SelectLineStart)+1;
  1387.  
  1388.      IF Extra^.SelectLineEnd<Extra^.VSlider.acvalue THEN
  1389.      BEGIN  {whole text is in the lower editor section}
  1390.           sourc:=POINTER(Extra^.SelectLoAddr);
  1391.           len:=Extra^.SelectHiAddr-Extra^.SelectLoAddr;
  1392.           getmem(p,len);
  1393.           move(sourc^,p^,len);
  1394.           goto l;
  1395.      END;
  1396.  
  1397.      IF Extra^.SelectLineStart+1>Extra^.VSlider.acvalue+EditorMaxLines THEN
  1398.      BEGIN  {whole text is in the upper editor section}
  1399.           sourc:=POINTER(Extra^.SelectLoAddr);
  1400.           len:=Extra^.SelectHiAddr-Extra^.SelectLoAddr;
  1401.           getmem(p,len);
  1402.           move(sourc^,p^,len);
  1403.           goto l;
  1404.      END;
  1405.  
  1406.      IF Extra^.SelectLineStart<Extra^.VSlider.acvalue THEN
  1407.      BEGIN {Text starts in the lower Editor section}
  1408.           Len:=Extra^.TextLow-Extra^.SelectLoAddr; {Part in the lower section}
  1409.           IF Extra^.SelectLineEnd+1>Extra^.VSlider.acvalue+EditorMaxLines THEN
  1410.           BEGIN {Upperline is in upper section}
  1411.                SelLowLen:=Len;
  1412.                FOR t:=0 TO EditorMaxLines DO
  1413.                BEGIN
  1414.                     s:=Extra^.ScreenBuffer[t];
  1415.                     WHILE s[length(s)]=#32 DO dec(s[0]);
  1416.                     inc(len,length(s)+2);
  1417.                END;
  1418.                SelHighLen:=Extra^.SelectHiAddr-Extra^.TextHigh;
  1419.                inc(Len,SelHighLen);
  1420.                getmem(p,len);
  1421.                sourc:=POINTER(Extra^.SelectLoAddr);
  1422.                move(sourc^,p^,SelLowLen);
  1423.                FOR t:=0 TO EditorMaxLines DO
  1424.                BEGIN
  1425.                     s:=Extra^.ScreenBuffer[t];
  1426.                     WHILE s[length(s)]=#32 DO dec(s[0]);
  1427.                     s:=s+#13+#10;
  1428.                     move(s[1],p^[SelLowLen],length(s));
  1429.                     inc(SelLowLen,Length(s));
  1430.                END;
  1431.                Sourc:=POINTER(Extra^.TextHigh);
  1432.                move(sourc^,p^[SelLowLen],SelHighlen);
  1433.           END
  1434.           ELSE  {Upperline is within the line buffer}
  1435.           BEGIN
  1436.                SelLowLen:=Len;
  1437.                SelEnd:=Extra^.SelectLineEnd-Extra^.VSlider.acvalue;
  1438.                FOR t:=0 TO SelEnd DO
  1439.                BEGIN
  1440.                     s:=Extra^.ScreenBuffer[t];
  1441.                     WHILE s[length(s)]=#32 DO dec(s[0]);
  1442.                     inc(len,length(s)+2);
  1443.                END;
  1444.                sourc:=POINTER(Extra^.SelectLoAddr);
  1445.                getmem(p,len);
  1446.                move(sourc^,p^,SelLowLen);
  1447.                FOR t:=0 TO SelEnd DO
  1448.                BEGIN
  1449.                     s:=Extra^.ScreenBuffer[t];
  1450.                     WHILE s[length(s)]=#32 DO dec(s[0]);
  1451.                     s:=s+#13+#10;
  1452.                     move(s[1],p^[SelLowLen],length(s));
  1453.                     inc(SelLowLen,Length(s));
  1454.                END;
  1455.           END;
  1456.           goto l;
  1457.      END;
  1458.  
  1459.      {Text starts in the LineBuffer}
  1460.      SelStart:=Extra^.SelectLineStart-Extra^.VSlider.acvalue;
  1461.      Len:=0;
  1462.      SelLowLen:=0;
  1463.      SelEnd:=Extra^.SelectLineEnd-Extra^.VSlider.acvalue;
  1464.      IF Extra^.SelectLineEnd+1>Extra^.VSlider.acvalue+EditorMaxLines THEN
  1465.      BEGIN {Upperline is in upper section}
  1466.           FOR t:=SelStart TO EditorMaxLines DO
  1467.           BEGIN
  1468.                s:=Extra^.ScreenBuffer[t];
  1469.                WHILE s[length(s)]=#32 DO dec(s[0]);
  1470.                inc(len,length(s)+2);
  1471.           END;
  1472.           SelHighLen:=Extra^.SelectHiAddr-Extra^.TextHigh;
  1473.           inc(Len,SelHighLen);
  1474.           getmem(p,len);
  1475.           FOR t:=SelStart TO EditorMaxLines DO
  1476.           BEGIN
  1477.                 s:=Extra^.ScreenBuffer[t];
  1478.                 WHILE s[length(s)]=#32 DO dec(s[0]);
  1479.                 s:=s+#13+#10;
  1480.                 move(s[1],p^[SelLowLen],length(s));
  1481.                 inc(SelLowLen,Length(s));
  1482.           END;
  1483.           Sourc:=POINTER(Extra^.TextHigh);
  1484.           move(sourc^,p^[SelLowLen],SelHighlen);
  1485.      END
  1486.      ELSE  {Upperline is within the line buffer}
  1487.      BEGIN
  1488.           FOR t:=SelStart TO SelEnd DO
  1489.           BEGIN
  1490.                s:=Extra^.ScreenBuffer[t];
  1491.                WHILE s[length(s)]=#32 DO dec(s[0]);
  1492.                inc(len,length(s)+2);
  1493.           END;
  1494.           getmem(p,len);
  1495.           FOR t:=SelStart TO SelEnd DO
  1496.           BEGIN
  1497.                 s:=Extra^.ScreenBuffer[t];
  1498.                 WHILE s[length(s)]=#32 DO dec(s[0]);
  1499.                 s:=s+#13+#10;
  1500.                 move(s[1],p^[SelLowLen],length(s));
  1501.                 inc(SelLowLen,Length(s));
  1502.           END;
  1503.      END;
  1504. l:
  1505.      {Set SelectColumnEnd}
  1506.      IF p<>NIL THEN IF Len>2 THEN
  1507.       IF Extra^.SelectLineEnd-Extra^.SelectLineStart>0 THEN
  1508.      BEGIN
  1509.           FOR t:=Len-3 downto Len-256 DO
  1510.           BEGIN
  1511.                IF p^[t]=10 THEN
  1512.                BEGIN
  1513. l2:
  1514.                     inc(t,Extra^.SelectColumnEnd+1);
  1515.                     IF t>Len-2 THEN t:=Len
  1516.                     ELSE
  1517.                     BEGIN
  1518.                          Len:=t+1;
  1519.                          p^[t]:=13;
  1520.                          p^[t+1]:=10;
  1521.                     END;
  1522.                     goto l1;
  1523.                END
  1524.                ELSE IF p^[t]=13 THEN goto l2;
  1525.           END;
  1526. l1:
  1527.      END;
  1528.      CopySelectedText:=p;
  1529. END;
  1530.  
  1531. PROCEDURE TEditorApplication.SetSliderValues(Win:HWND;Extra:PEditor);
  1532. VAR
  1533.    ww,ww1:WORD;
  1534.    p:POINTER;
  1535.    ScrollWin,FrameWin:HWND;
  1536.    r:LONGWORD;
  1537.    rc:RECTL;
  1538. BEGIN
  1539.      WinQueryWindowrect(rc,Win);
  1540.      FrameWin:=WinQueryWindow(QW_PARENT,Win);
  1541.  
  1542.      {init horicontal ScrollWindow}
  1543.      ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
  1544.      r:=(rc.XRight-rc.XLeft) div CharWidth;
  1545.      Extra^.TextViewX:=r;
  1546.      Extra^.HSlider.scrollbottom:=0;
  1547.      Extra^.HSlider.scrolltop:=239;
  1548.      Extra^.HSlider.viewarea:=r;
  1549.  
  1550.      {define horizontal Scroll intervall}
  1551.      ww1:=1;
  1552.      ww:=CalcMaxSliderPositions(Extra^.HSlider);
  1553.      p:=MPFROM2SHORT(ww1,ww);
  1554.      WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
  1555.  
  1556.      {Set horizontal slider size}
  1557.      ww1:=Extra^.HSlider.viewarea;
  1558.      ww:=Extra^.HSlider.scrolltop-Extra^.HSlider.scrollbottom+1;
  1559.      p:=MPFROM2SHORT(ww1,ww);
  1560.      WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
  1561.  
  1562.      {init vertical ScrollWindow}
  1563.      ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
  1564.      r:=(rc.yTop-rc.yBottom) div CharHeight;
  1565.      Extra^.TextViewY:=r;
  1566.      Extra^.VSlider.scrollbottom:=0;
  1567.      Extra^.VSlider.scrolltop:=Extra^.TextLines;
  1568.      Extra^.VSlider.viewarea:=r;
  1569.  
  1570.      {define vertical Scroll intervall}
  1571.      ww1:=1;
  1572.      ww:=CalcMaxSliderPositions(Extra^.VSlider);
  1573.      p:=MPFROM2SHORT(ww1,ww);
  1574.      WinSendMsg(p,LongToPointer(1),SBM_SETSCROLLBAR,ScrollWin);
  1575.  
  1576.      {Set vertical slider size}
  1577.      ww1:=Extra^.VSlider.viewarea;
  1578.      ww:=Extra^.VSlider.scrolltop-Extra^.VSlider.scrollbottom+1;
  1579.      p:=MPFROM2SHORT(ww1,ww);
  1580.      WinSendmsg(NIL,p,SBM_SETTHUMBSIZE,ScrollWin);
  1581. END;
  1582.  
  1583. FUNCTION TEditorApplication.CutSelectedText(Win:HWND;Extra:PEditor;
  1584.                          VAR Len:LONGWORD):PTextBuf;
  1585. VAR
  1586.    pres:PTextBuf;
  1587.    CountLines,t:WORD;
  1588.    sstart:WORD;
  1589.    CopyLen:LONGWORD;
  1590.    SourcBuf,DestBuf:PTextBuf;
  1591. Label l;
  1592. BEGIN
  1593.      {Get the text}
  1594.      pres:=CopySelectedText(Win,Extra,Len);
  1595.      {Now cut this text}
  1596.      CountLines:=Extra^.SelectLineEnd-Extra^.SelectLineStart;
  1597.      inc(CountLines);
  1598.      IF Extra^.SelectLineEnd<Extra^.VSlider.acvalue THEN
  1599.      BEGIN  {whole text is in the lower editor section}
  1600.           CopyLen:=Extra^.TextLow-Extra^.SelectHiAddr;
  1601.           IF CopyLen>0 THEN
  1602.           BEGIN
  1603.                SourcBuf:=POINTER(Extra^.SelectHiAddr);
  1604.                DestBuf:=POINTER(Extra^.SelectLoAddr);
  1605.                Move(SourcBuf^,DestBuf^,CopyLen);
  1606.           END;
  1607.           Extra^.TextLow:=Extra^.SelectLoAddr+CopyLen;
  1608.           goto l;
  1609.      END;
  1610.  
  1611.      IF Extra^.SelectLineStart+1>Extra^.VSlider.acvalue+EditorMaxLines THEN
  1612.      BEGIN  {whole text is in the upper editor section}
  1613.           CopyLen:=Extra^.SelectLoAddr-Extra^.TextHigh;
  1614.           IF CopyLen>0 THEN
  1615.           BEGIN
  1616.                SourcBuf:=POINTER(Extra^.TextHigh);
  1617.                DestBuf:=POINTER(Extra^.SelectHiAddr-CopyLen);
  1618.                Move(SourcBuf^,DestBuf^,CopyLen);
  1619.           END;
  1620.           Extra^.TextHigh:=Extra^.SelectHiAddr-CopyLen;
  1621.           goto l;
  1622.      END;
  1623.  
  1624.      IF Extra^.SelectLineStart<Extra^.VSlider.acvalue THEN
  1625.      BEGIN {Text starts in the lower Editor section}
  1626.           Extra^.TextLow:=Extra^.SelectLoAddr;
  1627.           IF Extra^.SelectLineEnd+1>Extra^.VSlider.acvalue+EditorMaxLines THEN
  1628.           BEGIN {Upperline is in upper section}
  1629.                Extra^.TextHigh:=Extra^.SelectHiAddr;
  1630.                FOR t:=0 TO EditorMaxLines DO
  1631.                  GetUpperLine(Extra^.ScreenBuffer[t],Extra);
  1632.           END
  1633.           ELSE  {Upperline is within the line buffer}
  1634.           BEGIN
  1635.                countlines:=Extra^.SelectLineEnd-Extra^.VSlider.acvalue;
  1636.                inc(countlines);
  1637.                FOR t:=0 TO EditorMaxLines-countlines DO
  1638.                  Extra^.ScreenBuffer[t]:=Extra^.ScreenBuffer[t+countlines];
  1639.                FOR t:=(EditorMaxLines-countlines)+1 TO EditorMaxLines DO
  1640.                  GetUpperLine(Extra^.ScreenBuffer[t],Extra);
  1641.           END;
  1642.           goto l;
  1643.      END;
  1644.  
  1645.      {Text starts in the LineBuffer}
  1646.      IF Extra^.SelectLineEnd+1>Extra^.VSlider.acvalue+EditorMaxLines THEN
  1647.      BEGIN {Upperline is in upper section}
  1648.           Extra^.TextHigh:=Extra^.SelectHiAddr;
  1649.           sstart:=Extra^.SelectLineStart-Extra^.VSlider.acvalue;
  1650.           FOR t:=sstart TO EditorMaxLines DO
  1651.             GetUpperLine(Extra^.ScreenBuffer[t],Extra);
  1652.      END
  1653.      ELSE  {Upperline is within the line buffer}
  1654.      BEGIN
  1655.           sstart:=Extra^.SelectLineStart-Extra^.VSlider.acvalue;
  1656.           FOR t:=sstart TO EditorMaxLines-countlines DO
  1657.            Extra^.ScreenBuffer[t]:=Extra^.ScreenBuffer[t+countlines];
  1658.           FOR t:=(EditorMaxLines-countlines)+1 TO EditorMaxLines DO
  1659.            GetUpperLine(Extra^.ScreenBuffer[t],Extra);
  1660.      END;
  1661. l:
  1662.      dec(Extra^.TextLines,Extra^.SelectLineEnd-Extra^.SelectLineStart);
  1663.      CutSelectedText:=pres;
  1664. END;
  1665.  
  1666. PROCEDURE TextToClipBoard(p:PTextBuf;Len:LONGWORD;e:PEditor);
  1667. VAR
  1668.    PBuf:PTextBuf;
  1669.    EndText:LONGWORD;
  1670.    SelLen:LONGWORD;
  1671. BEGIN
  1672.      IF e^.SelectColumnStart>0 THEN
  1673.      BEGIN
  1674.          inc(p,e^.SelectColumnStart-1);
  1675.          dec(Len,e^.SelectColumnStart-1);
  1676.      END;
  1677.      SelLen:=e^.SelectColumnEnd;
  1678.      IF e^.SelectLineEnd-e^.SelectLineStart=0 THEN
  1679.       IF e^.SelectColumnStart>0 THEN dec(SelLen,e^.SelectColumnStart-1);
  1680.      {Search for end of text}
  1681.      ASM
  1682.         MOV ESI,$p
  1683.         ADD ESI,$Len
  1684.         DEC ESI     ;Overread LF
  1685.         DEC ESI     ;and CR
  1686. !tnfound:
  1687.         CMP ESI,$p
  1688.         JBE !tfound
  1689.         CMPB [ESI-1],10
  1690.         JE !tfound
  1691.         CMPB [ESI-1],13
  1692.         JE !tfound
  1693.         DEC ESI
  1694.         JMP !tnfound
  1695. !tfound:
  1696.         ADD ESI,$SelLen
  1697.         MOV EDI,$p
  1698.         ADD EDI,$Len
  1699.         CMP ESI,EDI
  1700.         JBE !tok
  1701.         MOV ESI,EDI
  1702. !tok:
  1703.         SUB ESI,$p
  1704.         MOV $Len,ESI
  1705.      END;
  1706.      IF WinOpenClipBrd(AppHandle)<>0 THEN
  1707.      BEGIN
  1708.           DosAllocSharedMem(PAG_WRITE OR PAG_COMMIT OR OBJ_GIVEABLE,
  1709.                             Len,NIL,PBuf);
  1710.           IF PBuf=NIL THEN
  1711.           BEGIN
  1712.                ErrorBox(MB_ICONHAND,'Could not copy/cut text');
  1713.                exit;
  1714.           END;
  1715.           Move(p^,PBuf^,Len);
  1716.           WinEmptyClipBrd(AppHandle);
  1717.           WinSetClipBrdData(CFI_POINTER,CF_TEXT,LONGWORD(PBuf),AppHandle);
  1718.           WinCloseClipBrd(AppHandle);
  1719.      END
  1720.      ELSE ErrorBox(MB_ICONHAND,'Could not access clipboard');
  1721. END;
  1722.  
  1723. FUNCTION GetClipBoardText(VAR Len:LONGWORD;VAR CountLines:WORD):PTextBuf;
  1724. VAR p,p1:PTextBuf;
  1725. Label l,l1;
  1726. BEGIN
  1727.      p1:=NIL;
  1728.      CountLines:=0;
  1729.      IF WinOpenClipBrd(AppHandle)<>0 THEN
  1730.      BEGIN
  1731.           p:=WinQueryClipBrdData(CF_TEXT,AppHandle);
  1732.           IF p=NIL THEN goto l1;
  1733.           FOR Len:=0 TO 10000000 DO
  1734.           BEGIN
  1735.                IF p^[Len]=10 THEN inc(CountLines);
  1736.                IF p^[Len]=0 THEN goto l;
  1737.           END;
  1738.           ErrorBox(MB_ICONHAND,'Cannot paste clipboard');
  1739.           goto l1;
  1740. l:
  1741.           Getmem(p1,Len);
  1742.           Move(p^,p1^,Len);
  1743.           WinCloseClipBrd(AppHandle);
  1744.      END;
  1745. l1:
  1746.      GetClipBoardText:=p1;
  1747. END;
  1748.  
  1749. PROCEDURE TEditorApplication.ContextHelp(Context:String);
  1750. BEGIN
  1751. END;
  1752.  
  1753. PROCEDURE TEditorApplication.HandleCommand(Win:HWND;Command:WORD);
  1754. VAR
  1755.    e:PEditor;
  1756.    p:PTextBuf;
  1757.    Len:LONGWORD;
  1758.    CountLines:WORD;
  1759.    s:string;
  1760.    bs,be,b:BYTE;
  1761. Label l,l1,l2,l3;
  1762. BEGIN
  1763.      Inherited.HandleCommand(Win,Command);
  1764.      IF EditorCount=0 THEN exit;
  1765.      MDIGetTopWindow(e);
  1766.      IF e=NIL THEN exit;
  1767.      CASE Command OF
  1768.          CM_SEARCHAGAIN:
  1769.          BEGIN
  1770.               CASE e^.LastSearch OF
  1771.                 1:
  1772.                 BEGIN
  1773.                    IF not FindText(e^.LastSearchStr,e^.LastSearchOpt OR 2) THEN
  1774.                     Errorbox(MB_WARNING,'Item not found !');
  1775.                 END;
  1776.                 2:
  1777.                 BEGIN
  1778.                    IF not ReplaceText(e^.LastSearchStr,e^.LastReplStr,
  1779.                                       e^.LastSearchOpt OR 2) THEN
  1780.                     Errorbox(MB_WARNING,'Item not found !');
  1781.                 END;
  1782.               END; {case}
  1783.          END;
  1784.          CM_CONTEXTHELP:
  1785.          BEGIN
  1786.               s:=e^.ScreenBuffer[e^.CursorY-1];
  1787.               bs:=e^.CursorX;
  1788.               be:=bs;
  1789.               b:=ord(s[bs]);
  1790.               IF b<65 THEN exit;
  1791.               IF b>122 THEN exit;
  1792.               IF b>90 THEN IF b<97 THEN exit;
  1793.               IF bs>1 THEN
  1794.               BEGIN
  1795. l1:
  1796.                    b:=ord(s[bs-1]);
  1797.                    IF b<65 THEN goto l;
  1798.                    IF b>122 THEN goto l;
  1799.                    IF b>90 THEN IF b<97 THEN goto l;
  1800.                    dec(bs);
  1801.                    IF bs>1 THEN goto l1;
  1802.               END;
  1803. l:
  1804.               IF be<length(s) THEN
  1805.               BEGIN
  1806. l3:
  1807.                    b:=ord(s[be+1]);
  1808.                    IF b<65 THEN goto l2;
  1809.                    IF b>122 THEN goto l2;
  1810.                    IF b>90 THEN IF b<97 THEN goto l2;
  1811.                    inc(be);
  1812.                    IF be<length(s) THEN goto l3;
  1813.               END;
  1814. l2:
  1815.               SubStr(s,bs,(be-bs)+1);
  1816.               FOR b:=1 TO length(s) DO s[b]:=Upcase(s[b]);
  1817.               ContextHelp(s);
  1818.          END;
  1819.          CM_COPY:
  1820.          BEGIN
  1821.               EditorStatusMessage('Copy selected text');
  1822.               p:=CopySelectedText(e^.ChildWin,e,Len);
  1823.               IF p=NIL THEN
  1824.               BEGIN
  1825.                    EditorStatusMessage('');
  1826.                    exit;
  1827.               END;
  1828.               TextToClipBoard(p,Len,e);
  1829.               FreeMem(p,Len);
  1830.               InvalidateEditorWindow(e^.ChildWin,e);
  1831.               EditorStatusMessage('');
  1832.          END;
  1833.          CM_CUT:
  1834.          BEGIN
  1835.               IF e^.SelectLineStart=65535 THEN exit;
  1836.               IF e^.SelectLineEnd=65535 THEN exit;
  1837.               GotoLine(e,e^.SelectLineStart+1,e^.SelectColumnStart);
  1838.               EditorStatusMessage('Cut selected text');
  1839.               p:=CutSelectedText(e^.ChildWin,e,Len);
  1840.               IF p=NIL THEN
  1841.               BEGIN
  1842.                    EditorStatusMessage('');
  1843.                    exit;
  1844.               END;
  1845.               SetSliderValues(e^.ChildWin,e);
  1846.               TextToClipBoard(p,Len,e);
  1847.               FreeMem(p,Len);
  1848.               e^.Modified:=TRUE;
  1849.               e^.SelectColumnStart:=65535;
  1850.               e^.SelectLineStart:=65535;
  1851.               e^.SelectColumnEnd:=65535;
  1852.               e^.SelectLineEnd:=65535;
  1853.               e^.SelectLoAddr:=0;
  1854.               e^.SelectHiAddr:=0;
  1855.               InvalidateEditorWindow(e^.ChildWin,e);
  1856.               EditorStatusMessage('');
  1857.          END;
  1858.          CM_PASTE:
  1859.          BEGIN
  1860.               EditorStatusMessage('Paste text in clipboard');
  1861.               p:=GetClipBoardText(Len,CountLines);
  1862.               inc(CountLines);
  1863.               IF p=NIL THEN
  1864.               BEGIN
  1865.                    EditorStatusMessage('');
  1866.                    exit;
  1867.               END;
  1868.               e^.SelectColumnStart:=1;
  1869.               e^.SelectColumnEnd:=250;
  1870.               e^.SelectLineStart:=1;
  1871.               e^.SelectLineEnd:=1+CountLines;
  1872.               PutText(e^.ChildWin,e,p,Len,CountLines);
  1873.               InvalidateEditorWindow(e^.ChildWin,e);
  1874.               EditorStatusMessage('');
  1875.          END;
  1876.      END; {case}
  1877. END;
  1878.  
  1879. FUNCTION TEditorApplication.HandleEvent(Win:HWND;Msg:LONGWORD;
  1880.                                         para1,para2:POINTER;
  1881.                                         VAR Handled:BOOLEAN):LONGWORD;
  1882. VAR r:LONGWORD;
  1883. BEGIN
  1884.      r:=Inherited.HandleEvent(Win,Msg,para1,para2,Handled);
  1885.      HandleEvent:=r;
  1886. END;
  1887.  
  1888. PROCEDURE TEditorApplication.SetPosText(Win:HWND;Extra:PEditor);
  1889. VAR
  1890.    s,s1:String;
  1891.    di:dirstr;
  1892.    na:namestr;
  1893.    ex:extstr;
  1894.    sp:PString;
  1895.    FrameWin:HWND;
  1896. BEGIN
  1897.      s1:=Extra^.Title;
  1898.      IF length(s1)>60 THEN
  1899.      BEGIN
  1900.            fsplit(s1,di,na,ex);
  1901.            s1:='...\'+na+ex;
  1902.      END;
  1903.      s:=s1+'   '+tostr(Extra^.CursorY+Extra^.VSlider.acvalue)+':'+
  1904.        tostr(Extra^.CursorX+Extra^.HSlider.acvalue);
  1905.      IF Extra^.Modified THEN s:=s+' *';
  1906.      sp:=s;
  1907.      FrameWin:=WinQueryWindow(QW_PARENT,Win);
  1908.      WinSetWindowText(sp,FrameWin);
  1909. END;
  1910.  
  1911. PROCEDURE TEditorApplication.ClearErrorLine(Win:HWND;pp:PEditor);
  1912. BEGIN
  1913. END;
  1914.  
  1915.  
  1916. PROCEDURE TEditorApplication.SetCursor(Win:HWND;pp:PEditor);
  1917. VAR cux,cuy:LONGWORD;
  1918.     rec:RECTL;
  1919.     ScrollWin,FrameWin:HWND;
  1920.     w:WORD;
  1921.     p:POINTER;
  1922.     ww,ww1:WORD;
  1923.     t:LONGWORD;
  1924. BEGIN
  1925.      WinShowCursor(0,Win);
  1926.      WinQueryWindowRect(rec,Win);
  1927.      cux:=2+(pp^.CursorX-1)*CharWidth;
  1928.      cuy:=rec.yTop-(pp^.CursorY)*CharHeight;
  1929.      dec(cuy,2);
  1930.      ASM
  1931.         ;Set window cursor
  1932.         PUSHL 0      ;whole window
  1933.         PUSHL 8004h  ;CURSOR_SETPOS
  1934.         PUSHL 2      ;Cusizey
  1935.         PUSHL _CharWidth
  1936.         PUSHL $cuy
  1937.         PUSHL $cux
  1938.         PUSHL $Win
  1939.         MOV AL,7
  1940.         CALLDLL PMWIN,715  ;WinCreateCursor
  1941.         ADD ESP,28
  1942.     END;
  1943.     WinShowCursor(1,Win);
  1944.     SetPosText(Win,pp);
  1945.     FrameWin:=WinQueryWindow(QW_PARENT,Win);
  1946.     ScrollWin:=WinWindowFromID(FID_HORZSCROLL,FrameWin);
  1947.     w:=CalcSliderfromValue(pp^.HSlider.acvalue,pp^.HSlider);
  1948.     p:=MPFROMSHORT(w);
  1949.     WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  1950.     ScrollWin:=WinWindowFromID(FID_VERTSCROLL,FrameWin);
  1951.     w:=CalcSliderfromValue(pp^.VSlider.acvalue,pp^.VSlider);
  1952.     p:=MPFROMSHORT(w);
  1953.     WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  1954. END;
  1955.  
  1956. FUNCTION TEditorApplication.ErrorLineHandled(Win:HWND;pp:PEditor;
  1957.                             s:string):BOOLEAN;
  1958. BEGIN
  1959.      ErrorLineHandled:=FALSE;
  1960. END;
  1961.  
  1962. PROCEDURE TEditorApplication.MDIRedraw(rc:RECTL;_hps:HPS;Win:HWND;Data:POINTER);
  1963. VAR facename,s:string;
  1964.     rec:RECTL;
  1965.     pp:PEditor;
  1966.     Lines:LONGWORD;
  1967.     t:LongWord;
  1968.     pt:POINTL;
  1969.     ScrollX:LONGWORD;
  1970.     SelectLoLine,SelectHiLine:WORD;
  1971.     SelectLoColumn,SelectHiColumn:WORD;
  1972.     AcLine,AcColumn,help,TextViewX,Mul,Mul1:WORD;
  1973.     TextDrawColor,TextBackColor:LONGINT;
  1974.     incd:BOOLEAN;
  1975. Label l,l1,weiter;
  1976. BEGIN
  1977.     Inherited.MDIRedraw(rc,_hps,Win,Data);
  1978.     WinShowCursor(0,Win);
  1979.     facename:='System VIO';
  1980.     IF CharHeight=8 THEN CreateLogFont(_hps,facename,CharHeight,CharWidth-1,
  1981.                          FATTR_SEL_BOLD) {small font}
  1982.     ELSE CreateLogFont(_hps,facename,CharHeight,CharWidth,0); {default font}
  1983.     pp:=Data;
  1984.     GpiSetBackMix(2,_hps); {BM_OverPaint}
  1985.     WinQueryWindowRect(rec,Win);
  1986.     Lines:=(rec.ytop-rec.ybottom) div CharHeight; {Lines to draw}
  1987.     pt.x:=2;
  1988.     pt.y:=rec.yTop-CharHeight;
  1989.     ScrollX:=pp^.HSlider.acvalue;
  1990.  
  1991.     SelectLoLine:=pp^.SelectLineStart;
  1992.     SelectHiLine:=pp^.SelectLineEnd;
  1993.     SelectLoColumn:=pp^.SelectColumnStart;
  1994.     SelectHiColumn:=pp^.SelectColumnEnd;
  1995.     AcLine:=pp^.VSlider.acvalue;
  1996.     AcColumn:=ScrollX+1;
  1997.     TextViewX:=pp^.TextViewX+1;
  1998.  
  1999.     IF SelectLoColumn<65535 THEN
  2000.     BEGIN
  2001.         IF SelectLoColumn>AcColumn-1 THEN
  2002.         BEGIN
  2003.              Dec(SelectLoColumn,AcColumn-1);
  2004.              Mul:=CharWidth*(SelectLoColumn-1);
  2005.         END
  2006.         ELSE SelectLoColumn:=0;
  2007.     END
  2008.     ELSE SelectLoColumn:=0;
  2009.  
  2010.     IF SelectHiColumn<65535 THEN
  2011.     BEGIN
  2012.         IF SelectHiColumn>AcColumn-1 THEN
  2013.         BEGIN
  2014.              Dec(SelectHiColumn,AcColumn-1);
  2015.              Mul1:=CharWidth*SelectHiColumn;
  2016.         END
  2017.         ELSE SelectHiColumn:=0;
  2018.     END
  2019.     ELSE SelectHiColumn:=0;
  2020.  
  2021.     TextDrawColor:=GetMDIColor(Win);
  2022.     TextBackColor:=GetMDIBackColor(Win);
  2023.     GpiSetColor(TextDrawColor,_hps);
  2024.     GpiSetBackColor(TextBackColor,_hps);
  2025.     FOR t:=0 TO Lines-1 DO
  2026.     BEGIN
  2027.         help:=t+AcLine;
  2028.         IF pp^.ErrorMode THEN
  2029.         BEGIN
  2030.              IF Help+1=pp^.ErrorLine THEN
  2031.              BEGIN
  2032.                   GpiSetColor(ErrorDrawColor,_hps);
  2033.                   GpiSetBackColor(ErrorBackColor,_hps);
  2034.                   GpiCharStringAt(pp^.ScreenBuffer[t][ScrollX+1],pp^.TextViewX+1,pt,_hps);
  2035.                   GpiSetColor(TextDrawColor,_hps);
  2036.                   GpiSetBackColor(TextBackColor,_hps);
  2037.                   goto weiter;
  2038.              END;
  2039.         END;
  2040.         IF ((help>=SelectLoLine)AND(Help<=SelectHiLine)) THEN
  2041.         BEGIN
  2042.              CASE Help OF
  2043.                 SelectLoLine:
  2044.                 BEGIN
  2045.                      IF SelectLoColumn>0 THEN
  2046.                      BEGIN
  2047.                           dec(SelectLoColumn);
  2048.                           IF SelectLoColumn>0 THEN
  2049.                           BEGIN
  2050.                               DrawEditorStr(pp^.ScreenBuffer[t][AcColumn],
  2051.                                             SelectLoColumn+2,pt,_hps,
  2052.                                             TextDrawColor);
  2053.                               inc(pt.x,Mul);
  2054.                               incd:=TRUE;
  2055.                           END
  2056.                           ELSE incd:=FALSE;
  2057.                           GpiSetColor(SelectDrawColor,_hps);
  2058.                           GpiSetBackColor(SelectBackColor,_hps);
  2059.                           IF Help=SelectHiLine THEN
  2060.                           BEGIN
  2061.                                GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
  2062.                                           SelectLoColumn],SelectHiColumn-
  2063.                                           SelectLoColumn,pt,_hps);
  2064.                                GpiSetColor(TextDrawColor,_hps);
  2065.                                GpiSetBackColor(TextBackColor,_hps);
  2066.                                inc(pt.x,mul1-mul);
  2067.                                IF SelectHiColumn<TextViewX THEN
  2068.                                DrawEditorStr(pp^.ScreenBuffer[t][AcColumn+
  2069.                                              SelectLoColumn+
  2070.                                             (SelectHiColumn-SelectLoColumn)],
  2071.                                              TextViewX-SelectHiColumn,pt,_hps,
  2072.                                              TextDrawColor)
  2073.                                ELSE DrawEditorStr(pp^.ScreenBuffer[t][AcColumn+
  2074.                                                   SelectLoColumn+
  2075.                                                   (SelectHiColumn-SelectLoColumn)],
  2076.                                                   TextViewX,pt,_hps,
  2077.                                                   TextDrawColor)
  2078.                                dec(pt.x,mul1-mul);
  2079.                           END
  2080.                           ELSE GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn+
  2081.                                           SelectLoColumn],TextViewX-SelectLoColumn,
  2082.                                           pt,_hps);
  2083.                           IF incd THEN dec(pt.x,Mul);
  2084.                      END
  2085.                      ELSE
  2086.                      BEGIN
  2087. l:
  2088.                           GpiSetColor(SelectDrawColor,_hps);
  2089.                           GpiSetBackColor(SelectBackColor,_hps);
  2090. l1:
  2091.                           GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
  2092.                                           pp^.TextViewX+1,pt,_hps);
  2093.                      END;
  2094.                      GpiSetColor(TextDrawColor,_hps);
  2095.                      GpiSetBackColor(TextBackColor,_hps);
  2096.                 END;
  2097.                 SelectHiLine:
  2098.                 BEGIN
  2099.                      IF SelectHiColumn>0 THEN
  2100.                      BEGIN
  2101.                           GpiSetColor(SelectDrawColor,_hps);
  2102.                           GpiSetBackColor(SelectBackColor,_hps);
  2103.                           GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
  2104.                                           SelectHiColumn+2,pt,_hps);
  2105.                           inc(pt.x,Mul1);
  2106.                           GpiSetColor(TextDrawColor,_hps);
  2107.                           GpiSetBackColor(TextBackColor,_hps);
  2108.                           IF SelectHiColumn<TextViewX THEN
  2109.                           DrawEditorStr(pp^.ScreenBuffer[t][AcColumn+
  2110.                                         SelectHiColumn],TextViewX-SelectHiColumn,
  2111.                                         pt,_hps,TextDrawColor)
  2112.                           ELSE DrawEditorStr(pp^.ScreenBuffer[t][AcColumn+
  2113.                                              SelectHiColumn],TextViewX,
  2114.                                              pt,_hps,TextDrawColor)
  2115.                           dec(pt.x,Mul1);
  2116.                      END
  2117.                      ELSE goto l1;
  2118.                 END;
  2119.                 ELSE
  2120.                 BEGIN
  2121.                      GpiSetColor(SelectDrawColor,_hps);
  2122.                      GpiSetBackColor(SelectBackColor,_hps);
  2123.                      GpiCharStringAt(pp^.ScreenBuffer[t][AcColumn],
  2124.                                      pp^.TextViewX+1,pt,_hps);
  2125.                      GpiSetColor(TextDrawColor,_hps);
  2126.                      GpiSetBackColor(TextBackColor,_hps);
  2127.                 END;
  2128.              END; {case}
  2129.         END
  2130.         ELSE DrawEditorStr(pp^.ScreenBuffer[t][ScrollX+1],pp^.TextViewX+11,
  2131.                            pt,_hps,TextDrawColor);
  2132. weiter:
  2133.         dec(pt.y,CharHeight);
  2134.     END;
  2135.  
  2136.     IF pp^.ErrorMode THEN
  2137.     BEGIN
  2138.          inc(pt.y,CharHeight);
  2139.          s:='Error in '+tostr(pp^.ErrorLine)+','+tostr(pp^.ErrorCol)+':';
  2140.          s:=s+pp^.ErrorStr;
  2141.          IF not ErrorLineHandled(Win,pp,s) THEN
  2142.          BEGIN
  2143.               WHILE length(s)<pp^.TextViewX+2 DO s:=s+' ';
  2144.               GpiSetColor(ErrorDrawColor,_hps);
  2145.               GpiSetBackColor(ErrorBackColor,_hps);
  2146.               GpiCharStringAt(s[1],pp^.TextViewX+1,pt,_hps);
  2147.          END;
  2148.     END;
  2149.     WinShowCursor(1,Win);
  2150.     SetCursor(Win,pp);
  2151. END;
  2152.  
  2153. PROCEDURE TEditorApplication.CheckHScrollBar(Win:HWND;para1,para2,Extra:PEditor);
  2154. VAr w:Word;
  2155.     p,p1:POINTER;
  2156.     l:LONGWORD;
  2157.     ScrollWin,FrameWin:HWND;
  2158.     SliderID:LONGWORD;
  2159.     HSliderX:SliderData;
  2160. LABEL lab;
  2161. BEGIN
  2162.      HSliderX:=Extra^.HSlider;
  2163.  
  2164.      l:=PointerToLong(para2);
  2165.      SliderID:=PointerToLong(para1);
  2166.      SliderID:=lo(SliderID);
  2167.      w:=hi(l);
  2168.      FrameWin:=WinQueryWindow(QW_PARENT,Win);
  2169.      ScrollWin:=WinWindowFromID(SliderID,FrameWin);
  2170.      CASE w OF
  2171.          SB_LINELEFT:
  2172.          BEGIN
  2173.               IF HSliderX.acvalue>0 THEN dec(HSliderX.acvalue);
  2174.               {ELSE HSliderX.acvalue:=HSliderX.scrollbottom;}
  2175.               {IF HSliderX.acValue+Extra^.CursorX<HSliderX.ScrollBottom THEN
  2176.               BEGIN
  2177.                   Beep(1200,200);
  2178.                   HSliderX.acvalue:=0;
  2179.               END;}
  2180.               w:=HSliderX.acvalue; {CalcSliderfromValue(HSliderX.acvalue,HSliderX);}
  2181.               p:=MPFROMSHORT(w);
  2182.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2183.               InvalidateEditorWindow(Win,Extra);
  2184.          END;
  2185.          SB_LINERIGHT:
  2186.          BEGIN
  2187.               IF HSliderX.acvalue+1<HSliderX.scrolltop THEN inc(HSliderX.acvalue);
  2188.               {ELSE HSliderX.acvalue:=HSliderX.scrolltop;}
  2189.               IF HSliderX.acValue+Extra^.CursorX>HSliderX.ScrollTop THEN
  2190.               BEGIN
  2191.                   Beep(1200,200);
  2192.                   HSliderX.acvalue:=HSliderX.ScrollTop-Extra^.CursorX;
  2193.               END;
  2194.               w:=HSliderX.acvalue; {CalcSliderfromValue(HSliderX.acvalue,HSliderX);}
  2195.               p:=MPFROMSHORT(w);
  2196.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2197.               InvalidateEditorWindow(Win,Extra);
  2198.          END;
  2199.          SB_PAGELEFT:
  2200.          BEGIN
  2201.               IF HSliderX.acvalue<HSliderX.Viewarea THEN HSliderX.acvalue:=0
  2202.               ELSE
  2203.               BEGIN
  2204.                   IF HSliderX.acvalue-HSliderX.viewarea>HSliderX.scrollbottom THEN
  2205.                     dec(HSliderX.acvalue,HSliderX.viewarea)
  2206.                   ELSE HSliderX.acvalue:=HSliderX.scrollbottom;
  2207.               END;
  2208.               goto lab;
  2209.          END;
  2210.          SB_PAGERIGHT:
  2211.          BEGIN
  2212.               IF HSliderX.acvalue+HSliderX.viewarea<HSliderX.scrolltop THEN
  2213.                  inc(HSliderX.acvalue,HSliderX.viewarea)
  2214.               ELSE HSliderX.acvalue:=HSliderX.scrolltop;
  2215. lab:
  2216.               IF HSliderX.acValue+Extra^.CursorX>HSliderX.ScrollTop THEN
  2217.               BEGIN
  2218.                   Beep(1200,200);
  2219.                   HSliderX.acvalue:=HSliderX.ScrollTop-Extra^.CursorX;
  2220.               END;
  2221.               w:=HSliderX.acvalue; {CalcSliderfromValue(HSliderX.acvalue,HSliderX);}
  2222.               p:=MPFROMSHORT(w);
  2223.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2224.          END;
  2225.          SB_SLIDERPOSITION:
  2226.          BEGIN
  2227.               w:=lo(l);
  2228.               HSliderX.acvalue:=CalcValuefromSlider(w,HSliderX);
  2229.               IF HSliderX.acValue+Extra^.CursorX>HSliderX.ScrollTop THEN
  2230.               BEGIN
  2231.                    Beep(1200,200);
  2232.                    HSliderX.acvalue:=HSliderX.ScrollTop-Extra^.CursorX;
  2233.                    w:=CalcSliderfromValue(HSliderX.acvalue,HSliderX);
  2234.                    p:=MPFROMSHORT(w);
  2235.                    WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2236.               END;
  2237.          END;
  2238.          ELSE exit;
  2239.      END; {Case}
  2240.      Extra^.HSlider:=HSliderX;
  2241. END;
  2242.  
  2243.  
  2244. FUNCTION TEditorApplication.CheckIfToScrollX(Win:HWND;Extra:PEditor;
  2245.                                              Update:BOOLEAN):BOOLEAN;
  2246. VAR ScrollX:LONGWORD;
  2247.     rec:RECTL;
  2248. BEGIN
  2249.      IF Extra^.CursorX>Extra^.TextViewX THEN
  2250.      BEGIN
  2251.           ScrollX:=Extra^.CursorX-Extra^.TextViewX;
  2252.           dec(Extra^.Cursorx,ScrollX);
  2253.           inc(Extra^.HSlider.acvalue,ScrollX);
  2254.           IF Update THEN InvalidateEditorWindow(Win,Extra);
  2255.           CheckIfToScrollX:=TRUE;
  2256.      END
  2257.      ELSE CheckIfToScrollX:=FALSE;
  2258. END;
  2259.  
  2260.  
  2261. PROCEDURE TEditorApplication.MDIHandleCharEvent(Win:HWND;ch:CHAR;Data:POINTER);
  2262. VAR s:string;
  2263.     x,y:LongWord;
  2264.     Extra1:PEditor;
  2265. label L;
  2266. BEGIN
  2267.      Extra1:=Data;
  2268.      Extra1^.ErrorMode:=FALSE;
  2269.      ClearErrorLine(Win,Data);
  2270.      x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  2271.      IF x>=Extra1^.HSlider.ScrollTop THEN
  2272.      BEGIN
  2273. l:
  2274.           beep(1200,200);
  2275.           exit;
  2276.      END;
  2277.      y:=Extra1^.CursorY-1;
  2278.      s:=Extra1^.ScreenBuffer[y];
  2279.      Extra1^.Modified:=TRUE;
  2280.      IF Extra1^.insertmode THEN s[x]:=ch
  2281.      ELSE
  2282.      BEGIN
  2283.           Insert(ch,s,x);
  2284.           IF Length(s)>250 THEN s[0]:=#250;
  2285.      END;
  2286.      inc(Extra1^.CursorX);
  2287.      Extra1^.ScreenBuffer[y]:=s;
  2288.      IF CheckIfToScrollX(Win,Extra1,TRUE) THEN exit;
  2289.      InvalidateEditorLine(Win,s,y+1,Extra1);
  2290. END;
  2291.  
  2292. PROCEDURE TEditorApplication.PageUp(Win:HWND;Extra:PEditor);
  2293. VAR t,t1:WORD;
  2294.     TextView:WORD;
  2295. BEGIN
  2296.      IF Extra^.TextLow<=LONGWORD(Extra^.TextBuffer) THEN
  2297.      BEGIN
  2298.           Extra^.CursorY:=1;
  2299.           exit;
  2300.      END;
  2301.      IF Extra^.VSlider.acvalue=0 THEN
  2302.      BEGIN
  2303.           Extra^.CursorY:=1;
  2304.           exit;
  2305.      END;
  2306.      TextView:=Extra^.TextViewY-1;
  2307.      IF TextView>Extra^.VSlider.acvalue THEN
  2308.      BEGIN
  2309.           TextView:=Extra^.VSlider.acvalue;
  2310.           Extra^.CursorY:=1;
  2311.      END;
  2312.      FOR t:=EditorMaxLines DOWNTO (EditorMaxLines-TextView)+1 DO
  2313.      BEGIN
  2314.           IF Extra^.VSlider.acvalue+t=Extra^.SelectLineEnd
  2315.             THEN Extra^.SelectHiAddr:=Extra^.TextHigh+1;
  2316.           AppendUpperLine(Extra^.ScreenBuffer[t],Extra);
  2317.           IF Extra^.VSlider.acvalue+t=Extra^.SelectLineStart
  2318.             THEN Extra^.SelectLoAddr:=Extra^.TextHigh+1;
  2319.      END;
  2320.      t1:=EditorMaxLines-TextView;  {Lines to transmit}
  2321.      ASM
  2322.         MOVZXW EAX,$t1
  2323.         INC EAX
  2324.         MOV EBX,63
  2325.         MUL EBX           ;multiply with 252 and divide by 4
  2326.         MOV ECX,EAX
  2327.  
  2328.         MOV ESI,$Extra    ;Source buffer
  2329.         MOVZXW EAX,_EditormaxLines
  2330.         MOVZXW EBX,$TextView
  2331.         SUB EAX,EBX
  2332.         INC EAX
  2333.         MOV EBX,252        ;multiply with 252
  2334.         MUL EBX
  2335.         ADD ESI,EAX       ;Source
  2336.  
  2337.         MOV EDI,$Extra    ;Destination
  2338.         MOVZXW EAX,_EditorMaxLines
  2339.         INC EAX
  2340.         MOV EBX,252
  2341.         MUL EBX           ;multiply with 252
  2342.         ADD EDI,EAX       ;Destination
  2343.  
  2344.         STD
  2345.         REP
  2346.         MOVSW             ;MOVSD
  2347.      END;
  2348.      FOR t:=TextView-1 DOWNTO 0 DO GetLowerLine(Extra^.ScreenBuffer[t],Extra);
  2349.      Dec(Extra^.VSlider.acvalue,TextView);
  2350. END;
  2351.  
  2352. PROCEDURE TEditorApplication.LineUp(Win:HWND;Extra:PEditor);
  2353. VAR t:WORD;
  2354. BEGIN
  2355.      IF Extra^.CursorY=1 THEN
  2356.      BEGIN
  2357.           IF Extra^.VSlider.acvalue=0 THEN exit;
  2358.           IF Extra^.TextLow<=LONGWORD(Extra^.TextBuffer) THEN
  2359.           BEGIN
  2360.                Extra^.VSlider.Acvalue:=0;
  2361.                exit;
  2362.           END;
  2363.           IF Extra^.VSlider.acvalue+EditorMaxLines=Extra^.SelectLineEnd THEN
  2364.              Extra^.SelectHiAddr:=Extra^.TextHigh+1;
  2365.           dec(Extra^.VSlider.acvalue);
  2366.           AppendUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
  2367.           IF Extra^.VSlider.acvalue+1+EditorMaxLines=Extra^.SelectLineStart
  2368.             THEN Extra^.SelectLoAddr:=Extra^.TextHigh+1;
  2369.           ASM
  2370.              MOVZXW EAX,_EditorMaxLines
  2371.              MOV EBX,63
  2372.              MUL EBX           ;multiply with 252 and divide by 4
  2373.              MOV ECX,EAX
  2374.  
  2375.              MOV ESI,$Extra    ;Source
  2376.              MOVZXW EAX,_EditorMaxLines
  2377.              INC EAX
  2378.              MOV EBX,252
  2379.              MUL EBX           ;multiply with 252
  2380.              ADD ESI,EAX
  2381.              MOV EDI,ESI       ;Destination
  2382.              SUB ESI,252       ;Source
  2383.  
  2384.              STD
  2385.              REP
  2386.              MOVSW             ;MOVSD
  2387.           END;
  2388.           GetLowerLine(Extra^.ScreenBuffer[0],Extra);
  2389.      END
  2390.      ELSE dec(Extra^.CursorY);
  2391. END;
  2392.  
  2393. PROCEDURE TEditorApplication.LineDown(Win:HWND;Extra:PEditor;
  2394.                                       CheckEmpty:BOOLEAN);
  2395. VAR t:Word;
  2396.     s:STRING;
  2397. label l;
  2398. BEGIN
  2399.      IF not CheckEmpty THEN goto l;
  2400.      IF Extra^.TextHigh>=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen THEN
  2401.      BEGIN
  2402.           {Check if there are more lines}
  2403.           FOR t:=Extra^.CursorY TO EditorMaxLines DO
  2404.           BEGIN
  2405.                s:=Extra^.ScreenBuffer[t];
  2406.                WHILE s[length(s)]=#32 DO dec(s[0]);
  2407.                IF s<>'' THEN goto l;
  2408.           END;
  2409.           exit;
  2410.      END;
  2411. l:
  2412.      inc(Extra ^.CursorY);
  2413.      IF Extra^.CursorY>Extra^.TextViewY THEN {We must scroll}
  2414.      BEGIN
  2415.           IF Extra^.VSlider.acvalue=Extra^.SelectLineStart THEN
  2416.             Extra^.SelectLoAddr:=Extra^.TextLow;
  2417.           Extra^.CursorY:=Extra^.TextViewY;
  2418.           inc(Extra^.VSlider.acvalue);
  2419.           AppendLowerLine(Extra^.ScreenBuffer[0],Extra);
  2420.           IF Extra^.VSlider.acvalue-1=Extra^.SelectLineEnd THEN
  2421.             Extra^.SelectHiAddr:=Extra^.TextLow;
  2422.           ASM
  2423.              MOVZXW EAX,_EditorMaxLines
  2424.              MOV EBX,63
  2425.              MUL EBX           ;multiply with 252 and divide by 4
  2426.              MOV ECX,EAX
  2427.  
  2428.              MOV EDI,$Extra    ;Destination
  2429.              ADD EDI,4
  2430.              MOV ESI,EDI       ;Source
  2431.              ADD ESI,252
  2432.  
  2433.              CLD
  2434.              REP
  2435.              MOVSW             ;MOVSD
  2436.           END;
  2437.           GetUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
  2438.      END;
  2439. END;
  2440.  
  2441. FUNCTION TEditorApplication.PageDown(Win:HWND;Extra:PEditor):BOOLEAN;
  2442. VAR
  2443.     Count:WORD;
  2444.     TextView:WORD;
  2445.     t,t1:WORD;
  2446.     s:STRING;
  2447. LABEL l;
  2448. BEGIN
  2449.      IF Extra^.TextHigh>=LONGWORD(Extra^.TextBuffer)+Extra^.TextLen THEN
  2450.      BEGIN
  2451.           {Check if there are more lines}
  2452.           FOR t:=Extra^.TextViewY TO EditorMaxLines DO
  2453.           BEGIN
  2454.                s:=Extra^.ScreenBuffer[t];
  2455.                WHILE s[length(s)]=#32 DO dec(s[0]);
  2456.                IF s<>'' THEN goto l;
  2457.           END;
  2458.           Extra^.CursorY:=Extra^.TextViewY;  {on last line}
  2459.           PageDown:=FALSE;
  2460.           exit;
  2461.      END;
  2462. l:
  2463.      TextView:=Extra^.TextViewY-1;
  2464.      FOR t:=0 TO TextView-1 DO
  2465.      BEGIN
  2466.           IF Extra^.VSlider.acvalue+t=Extra^.SelectLineStart THEN
  2467.             Extra^.SelectLoAddr:=Extra^.TextLow;
  2468.           AppendLowerLine(Extra^.ScreenBuffer[t],Extra);
  2469.           IF Extra^.VSlider.acvalue+t=Extra^.SelectLineEnd THEN
  2470.             Extra^.SelectHiAddr:=Extra^.TextLow;
  2471.      END;
  2472.      t1:=(EditorMaxLines-TextView)+1;  {Lines to transmit}
  2473.      ASM
  2474.         MOVZXW EAX,$t1
  2475.         MOV EBX,63
  2476.         MUL EBX           ;multiply with 252 and divide by 4
  2477.         MOV ECX,EAX
  2478.  
  2479.         MOV ESI,$Extra    ;Source buffer
  2480.         ADD ESI,4
  2481.         MOVZXW EAX,$TextView
  2482.         MOV EBX,252
  2483.         MUL EBX           ;multiply with 252
  2484.  
  2485.         ADD ESI,EAX       ;onto ScreenBuffer[TextView]
  2486.         MOV EDI,$Extra
  2487.         ADD EDI,4         ;onto ScreenBuffer[0]
  2488.         CLD
  2489.         REP
  2490.         MOVSW             ;MOVSD
  2491.      END;
  2492.      FOR t:=t1 TO EditorMaxLines DO GetUpperLine(Extra^.ScreenBuffer[t],Extra);
  2493.      Inc(Extra^.VSlider.acvalue,TextView);
  2494.      PageDown:=TRUE;
  2495. END;
  2496.  
  2497. PROCEDURE TEditorApplication.CheckVScrollBar(Win:HWND;para1,para2,Extra:PEditor);
  2498. VAr w:Word;
  2499.     p,p1:POINTER;
  2500.     l,r:LONGWORD;
  2501.     ScrollWin,FrameWin:HWND;
  2502.     SliderID:LONGWORD;
  2503.     t:WORD;
  2504.     t1:LONGWORD;
  2505.     acval:LONGWORD;
  2506.     aclineval:LONGWORD;
  2507.     acpageval:LONGWORD;
  2508. BEGIN
  2509.      l:=PointerToLong(para2);
  2510.      SliderID:=PointerToLong(para1);
  2511.      SliderID:=lo(SliderID);
  2512.      w:=hi(l);
  2513.      FrameWin:=WinQueryWindow(QW_PARENT,Win);
  2514.      ScrollWin:=WinWindowFromID(SliderID,FrameWin);
  2515.      CASE w OF
  2516.          SB_LINEUP:
  2517.          BEGIN
  2518.               Extra^.CursorY:=1;
  2519.               LineUp(Win,Extra);
  2520.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  2521.               p:=MPFROMSHORT(w);
  2522.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2523.               InvalidateEditorWindow(Win,Extra);
  2524.          END;
  2525.          SB_LINEDOWN:
  2526.          BEGIN
  2527.               Extra^.CursorY:=Extra^.TextViewY;
  2528.               LineDown(Win,Extra,TRUE);
  2529.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  2530.               p:=MPFROMSHORT(w);
  2531.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2532.               InvalidateEditorWindow(Win,Extra);
  2533.          END;
  2534.          SB_PAGEUP:
  2535.          BEGIN
  2536.               PageUp(Win,Extra);
  2537.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  2538.               p:=MPFROMSHORT(w);
  2539.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2540.          END;
  2541.          SB_PAGEDOWN:
  2542.          BEGIN
  2543.               PageDown(Win,Extra);
  2544.               w:=CalcSliderfromValue(Extra^.VSlider.acvalue,Extra^.VSlider);
  2545.               p:=MPFROMSHORT(w);
  2546.               WinSendMsg(NIL,p,SBM_SETPOS,ScrollWin);
  2547.          END;
  2548.          SB_SLIDERPOSITION:
  2549.          BEGIN
  2550.               w:=lo(l);
  2551.               acval:=CalcValuefromSlider(w,Extra^.VSlider);
  2552.               IF acval=Extra^.VSlider.acvalue THEN exit;
  2553.               IF acval>Extra^.VSlider.acvalue THEN
  2554.               BEGIN
  2555.                    r:=(acval-Extra^.VSlider.acvalue)+Extra^.TextViewY;
  2556.                    acpageval:=r div Extra^.TextViewY;
  2557.                    aclineval:=r mod Extra^.TextViewY;
  2558.                    FOR t1:=1 TO acpageval DO PageDown(Win,Extra);
  2559.                    FOR t1:=1 TO aclineval+acpageval DO LineDown(Win,Extra,TRUE);
  2560.               END
  2561.               ELSE
  2562.               BEGIN
  2563.                    r:=(Extra^.VSlider.acvalue-acval)+Extra^.TextViewY;
  2564.                    acpageval:=r div Extra^.TextViewY;
  2565.                    aclineval:=r mod Extra^.TextViewY;
  2566.                    FOR t1:=1 TO acpageval DO PageUp(Win,Extra);
  2567.                    FOR t1:=1 TO aclineval+acpageval DO LineUp(Win,Extra);
  2568.               END;
  2569.          END;
  2570.      END; {Case}
  2571. END;
  2572.  
  2573. PROCEDURE TEditorApplication.GotoLine(Extra:PEditor;Line,Col:WORD);
  2574. VAR
  2575.     acpageval,aclineval,r:WORD;
  2576.     t,t1,count,Save:WORD;
  2577.     Win:HWND;
  2578. Label l,l1,l2;
  2579. BEGIN
  2580.      IF EditorCount=0 THEN exit;
  2581.      EditorStatusMessage('Goto line:'+tostr(Line));
  2582.      Extra^.CursorX:=Col;
  2583.      Extra^.HSlider.AcValue:=0;
  2584.      IF Extra^.CursorX>Extra^.TextViewX THEN
  2585.      BEGIN
  2586.           Extra^.HSlider.acvalue:=Extra^.CursorX-Extra^.TextViewX;
  2587.           Extra^.CursorX:=Extra^.TextViewX;
  2588.      END;
  2589.      Win:=Extra^.ChildWin{FrameWin};
  2590.      t1:=Extra^.VSlider.acvalue+Extra^.CursorY;
  2591.      IF Line=t1 THEN
  2592.      BEGIN
  2593.           EditorStatusMessage('');
  2594.           exit;
  2595.      END;
  2596.      IF Line>t1 THEN
  2597.      BEGIN
  2598.           r:=Line-t1;
  2599.           acpageval:=r div Extra^.TextViewY;
  2600.           aclineval:=r mod Extra^.TextViewY;
  2601.           FOR t1:=1 TO acpageval DO
  2602.           BEGIN
  2603.                IF PageDown(Win,Extra)=FALSE THEN goto l2;
  2604.           END;
  2605.           FOR t1:=1 TO aclineval+acpageval DO LineDown(Win,Extra,TRUE);
  2606.           WHILE Extra^.CursorY+Extra^.VSlider.acvalue>Line DO
  2607.             LineUp(Win,Extra);
  2608.     END
  2609.     ELSE
  2610.     BEGIN
  2611.          r:=t1-Line;
  2612.          acpageval:=r div Extra^.TextViewY;
  2613.          aclineval:=r mod Extra^.TextViewY;
  2614.          FOR t1:=1 TO acpageval DO PageUp(Win,Extra);
  2615.          FOR t1:=1 TO aclineval+acpageval DO LineUp(Win,Extra);
  2616.          WHILE Extra^.CursorY+Extra^.VSlider.acvalue<Line DO
  2617.           LineDown(Win,Extra,TRUE);
  2618.     END;
  2619.     Save:=Extra^.CursorY;
  2620.     r:=Extra^.TextViewY DIV 2;
  2621.     IF Save=r THEN
  2622.     BEGIN
  2623.          EditorStatusMessage('');
  2624.          exit;
  2625.     END;
  2626.     IF Save>r THEN  {actual position greater}
  2627.     BEGIN
  2628.          r:=Save-r;
  2629.          Extra^.CursorY:=Extra^.TextViewY;
  2630.          count:=0;
  2631.          FOR t1:=1 TO r DO
  2632.          BEGIN
  2633.               t:=Extra^.vSlider.Acvalue;
  2634.               LineDown(Win,Extra,TRUE);
  2635.               IF t=Extra^.VSlider.Acvalue THEN goto l;
  2636.               inc(Count);
  2637.          END;
  2638. l:
  2639.          Extra^.CursorY:=save-count;
  2640.     END
  2641.     ELSE
  2642.     BEGIN
  2643.          dec(r,save);
  2644.          Extra^.CursorY:=1;
  2645.          count:=0;
  2646.          FOR t1:=1 TO r DO
  2647.          BEGIN
  2648.               t:=Extra^.vSlider.Acvalue;
  2649.               LineUp(Win,Extra);
  2650.               IF t=Extra^.VSlider.Acvalue THEN goto l1;
  2651.               inc(Count);
  2652.          END;
  2653. l1:
  2654.          Extra^.CursorY:=save+count;
  2655.     END;
  2656. l2:
  2657.     EditorStatusMessage('');
  2658.     InvalidateEditorWindow(Win,Extra);
  2659. END;
  2660.  
  2661. PROCEDURE TEditorApplication.MDICreateNotify(MDIFrWin,MDIWin:HWND;Data:POINTER);
  2662. VAR
  2663.     ww,ww1:Word;
  2664.     p:POINTER;
  2665.     p1:POINTER;
  2666.     ScrollWin:HWND;
  2667.     pp:PEditor;
  2668.     rec:RECTL;
  2669.     Lines:LONGWORD;
  2670. BEGIN
  2671.      inherited.MDICreateNotify(MDIFrWin,MDIWin,Data);
  2672.      pp:=Data;
  2673.      pp^.ChildWin:=MDIWin;
  2674.      pp^.FrameWin:=MDIFrWin;
  2675.      SetSliderValues(MDIWin,pp);
  2676.      pp^.HSlider.acvalue:=pp^.HSlider.scrollbottom;
  2677. END;
  2678.  
  2679. PROCEDURE TEditorApplication.InvalidateEditorLine(Win:HWND;var s:string;
  2680.                                                   y:LONGWORD;Extra:PEditor);
  2681. VAR _hps:LONGWORD;
  2682.     rec:RECTL;
  2683.     pt:POINTL;
  2684.     facename:String;
  2685.     scrollX:LONGWORD;
  2686.     SelectLoLine,SelectHiLine:WORD;
  2687.     SelectLoColumn,SelectHiColumn:WORD;
  2688.     acline,accolumn:WORD;
  2689.     help,TextViewX:WORD;
  2690.     pp:PEditor;
  2691.     mul,mul1,t:WORD;
  2692.     TextDrawColor,TextbackColor:LONGINT;
  2693.     incd:BOOLEAN;
  2694. Label l,l1,weiter;
  2695. BEGIN
  2696.      WinShowCursor(0,Win);
  2697.      _hps:=WinGetPS(Win);
  2698.      WinQueryWindowRect(rec,Win);
  2699.      facename:='System VIO';
  2700.      IF CharHeight=8 THEN CreateLogFont(_hps,facename,CharHeight,CharWidth-1,
  2701.                                         FATTR_SEL_BOLD) {small font}
  2702.      ELSE  CreateLogFont(_hps,facename,CharHeight,CharWidth,0); {default font}
  2703.      pt.x:=2;
  2704.      pt.y:=rec.yTop-y*CharHeight;
  2705.      scrollX:=Extra^.HSlider.acvalue;
  2706.      GpiSetBackMix(2,_hps);  {BM_OverPaint}
  2707.      pp:=Extra;
  2708.  
  2709.      SelectLoLine:=pp^.SelectLineStart;
  2710.      SelectHiLine:=pp^.SelectLineEnd;
  2711.      SelectLoColumn:=pp^.SelectColumnStart;
  2712.      SelectHiColumn:=pp^.SelectColumnEnd;
  2713.      AcLine:=pp^.VSlider.acvalue;
  2714.      AcColumn:=ScrollX+1;
  2715.      TextViewX:=pp^.TextViewX+1;
  2716.  
  2717.      IF SelectLoColumn<65535 THEN
  2718.      BEGIN
  2719.          IF SelectLoColumn>AcColumn-1 THEN
  2720.          BEGIN
  2721.               Dec(SelectLoColumn,AcColumn-1);
  2722.               Mul:=CharWidth*(SelectLoColumn-1);
  2723.          END
  2724.          ELSE SelectLoColumn:=0;
  2725.      END
  2726.      ELSE SelectLoColumn:=0;
  2727.  
  2728.      IF SelectHiColumn<65535 THEN
  2729.      BEGIN
  2730.          IF SelectHiColumn>AcColumn-1 THEN
  2731.          BEGIN
  2732.               Dec(SelectHiColumn,AcColumn-1);
  2733.               Mul1:=CharWidth*SelectHiColumn;
  2734.          END
  2735.          ELSE SelectHiColumn:=0;
  2736.      END
  2737.      ELSE SelectHiColumn:=0;
  2738.  
  2739.      TextDrawColor:=GetMDiColor(Win);
  2740.      TextBackColor:=GetMDIBackColor(Win);
  2741.      GpiSetColor(TextDrawColor,_hps);
  2742.      GpiSetBackColor(TextBackColor,_hps);
  2743.      t:=y;
  2744.      help:=t+AcLine;
  2745.      IF pp^.ErrorMode THEN
  2746.      BEGIN
  2747.           IF Help=pp^.ErrorLine THEN
  2748.           BEGIN
  2749.                GpiSetColor(ErrorDrawColor,_hps);
  2750.                GpiSetBackColor(ErrorBackColor,_hps);
  2751.                GpiCharStringAt(s[ScrollX+1],pp^.TextViewX+1,pt,_hps);
  2752.                goto weiter;
  2753.           END;
  2754.      END;
  2755.      IF ((help>=SelectLoLine)AND(Help<=SelectHiLine)) THEN
  2756.      BEGIN
  2757.           CASE Help OF
  2758.               SelectLoLine:
  2759.               BEGIN
  2760.                    IF SelectLoColumn>0 THEN
  2761.                    BEGIN
  2762.                         dec(SelectLoColumn);
  2763.                         IF SelectLoColumn>0 THEN
  2764.                         BEGIN
  2765.                              DrawEditorStr(s[AcColumn],
  2766.                                            SelectLoColumn+2,pt,_hps,
  2767.                                            TextDrawColor);
  2768.                              inc(pt.x,Mul);
  2769.                              incd:=TRUE;
  2770.                         END
  2771.                         ELSE incd:=FALSE;
  2772.                         GpiSetColor(SelectDrawColor,_hps);
  2773.                         GpiSetBackColor(SelectBackColor,_hps);
  2774.                         IF Help=SelectHiLine THEN
  2775.                         BEGIN
  2776.                             GpiCharStringAt(s[AcColumn+
  2777.                                        SelectLoColumn],SelectHiColumn-
  2778.                                        SelectLoColumn,pt,_hps);
  2779.                             GpiSetColor(TextDrawColor,_hps);
  2780.                             GpiSetBackColor(TextBackColor,_hps);
  2781.                             inc(pt.x,mul1-mul);
  2782.                             GpiCharStringAt(s[AcColumn+
  2783.                                        SelectLoColumn+
  2784.                                        (SelectHiColumn-SelectLoColumn)],
  2785.                                        TextViewX-SelectHiColumn,pt,_hps);
  2786.                             dec(pt.x,mul1-mul);
  2787.                         END
  2788.                         ELSE GpiCharStringAt(s[AcColumn+
  2789.                                         SelectLoColumn],TextViewX-SelectLoColumn,
  2790.                                         pt,_hps);
  2791.                         IF incd THEN dec(pt.x,Mul);
  2792.                  END
  2793.                  ELSE
  2794.                  BEGIN
  2795. l:
  2796.                       GpiSetColor(SelectDrawColor,_hps);
  2797.                       GpiSetBackColor(SelectBackColor,_hps);
  2798. l1:
  2799.                       GpiCharStringAt(s[AcColumn],
  2800.                                        pp^.TextViewX+1,pt,_hps);
  2801.                  END;
  2802.                 GpiSetColor(TextDrawColor,_hps);
  2803.                 GpiSetBackColor(TextBackColor,_hps);
  2804.            END;
  2805.            SelectHiLine:
  2806.            BEGIN
  2807.                 IF SelectHiColumn>0 THEN
  2808.                 BEGIN
  2809.                       GpiSetColor(SelectDrawColor,_hps);
  2810.                       GpiSetBackColor(SelectBackColor,_hps);
  2811.                       GpiCharStringAt(s[AcColumn],
  2812.                                         SelectHiColumn+2,pt,_hps);
  2813.                       inc(pt.x,Mul1);
  2814.                       GpiSetColor(TextDrawColor,_hps);
  2815.                       GpiSetBackColor(TextBackColor,_hps);
  2816.                       IF SelectHiColumn<TextViewX THEN
  2817.                       DrawEditorStr(s[AcColumn+
  2818.                                   SelectHiColumn],TextViewX-SelectHiColumn,
  2819.                                   pt,_hps,TextDrawColor)
  2820.                       ELSE DrawEditorStr(s[AcColumn+
  2821.                                          SelectHiColumn],TextViewX,
  2822.                                          pt,_hps,TextDrawColor);
  2823.                       dec(pt.x,Mul1);
  2824.                 END
  2825.                 ELSE goto l1;
  2826.             END;
  2827.             ELSE
  2828.             BEGIN
  2829.                  GpiSetColor(SelectDrawColor,_hps);
  2830.                  GpiSetBackColor(SelectBackColor,_hps);
  2831.                  GpiCharStringAt(s[AcColumn],
  2832.                                  pp^.TextViewX+1,pt,_hps);
  2833.                  GpiSetColor(TextDrawColor,_hps);
  2834.                  GpiSetBackColor(TextBackColor,_hps);
  2835.             END;
  2836.         END; {case}
  2837.      END
  2838.      ELSE DrawEditorStr(s[ScrollX+1],pp^.TextViewX+11,pt,_hps,TextDrawColor);
  2839. weiter:
  2840.      WinReleasePS(_hps);
  2841.      WinShowCursor(1,Win);
  2842.      SetCursor(Win,Extra);
  2843. END;
  2844.  
  2845. PROCEDURE TEditorApplication.InvalidateEditorWindow(Win:HWND;Extra:PEditor);
  2846. VAR _hps:LONGWORD;
  2847.     rec:RECTL;
  2848. BEGIN
  2849.      _hps:=WinGetPS(Win);
  2850.      WinQueryWindowRect(rec,Win);
  2851.      MDIRedraw(rec,_hps,Win,Extra);
  2852.      WinReleasePs(_hps);
  2853. END;
  2854.  
  2855. PROCEDURE GetBufferLine(VAR s:String;VAR Buffer:PTextBuf;Len:LONGWORD;
  2856.                         Max:LONGWORD);
  2857. VAR
  2858.     Adresse:LONGWORD;
  2859. Label l;
  2860. BEGIN
  2861.      Adresse:=LONGWORD(Buffer);
  2862.      IF Adresse>=Max THEN
  2863.      BEGIN
  2864.           s:='';
  2865.           goto l;
  2866.      END;
  2867.      ASM
  2868.         MOV CL,0
  2869.         MOV EDI,$s
  2870.         INC EDI
  2871.         MOV ESI,$Adresse
  2872. !rep_lab_1:
  2873.         CMP ESI,$Max
  2874.         JAE !crlf_1
  2875.         MOV AL,[ESI+0]
  2876.         INC ESI
  2877.         CMP AL,13
  2878.         JE !cr_1
  2879.         CMP AL,10
  2880.         JE !crlf_1
  2881.  
  2882.         INC CL
  2883.         MOV [EDI+0],AL
  2884.         INC EDI
  2885.         CMP CL,251
  2886.         JAE !crlf_1
  2887.         JMP !rep_lab_1
  2888. !cr_1:
  2889.         MOV AL,[ESI+0]
  2890.         CMP AL,10
  2891.         JNE !crlf_1
  2892.         INC ESI
  2893. !crlf_1:
  2894.         CLD
  2895.         MOV AL,0
  2896.         STOSB
  2897.         MOV EDI,$s
  2898.         MOV [EDI+0],CL   ;Set text len
  2899.         CMP ESI,$Max
  2900.         JBE !ok1_1
  2901.         MOV ESI,$Max
  2902. !ok1_1:
  2903.         MOV $Adresse,ESI
  2904.      END;
  2905.      Buffer:=POINTER(Adresse)
  2906. l:
  2907.      IF length(s)>250 THEN s[0]:=#250;
  2908.      ASM
  2909.         MOV EDI,$s
  2910.         MOV AL,[EDI+0]
  2911.         CMP AL,250
  2912.         JE !eee_1
  2913.         ;Length to short --> fill up with space
  2914.         MOVZX EAX,AL
  2915.         MOVB [EDI+0],250
  2916.         ADD EDI,EAX
  2917.         INC EDI
  2918.         MOV ECX,250
  2919.         SUB ECX,EAX
  2920.         MOV AL,32
  2921.         CLD
  2922.         REP
  2923.         STOSB
  2924.         MOV AL,0
  2925.         STOSB
  2926. !eee_1:
  2927.      END;
  2928. END;
  2929.  
  2930.  
  2931. PROCEDURE TEditorApplication.PutText(Win:HWND;Extra:PEditor;Buf:PTextBuf;
  2932.                                      Len,CountLines:LONGWORD);
  2933. VAR s,s1,s2:String;
  2934.     r:LONGWORD;
  2935.     rc:RECTL;
  2936.     ww,ww1:WORD;
  2937.     p:POINTER;
  2938.     x:WORD;
  2939.     FrameWin,ScrollWin:HWND;
  2940.     NewLStart,NewCStart,NewCEnd:WORD;
  2941.     OldCursorY:WORD;
  2942.     BLen,BufEnd:LONGWORD;
  2943.     t,t1:WORD;
  2944.     pb:^Byte;
  2945. BEGIN
  2946.      IF Extra^.SelectColumnStart=0 THEN inc(Extra^.SelectColumnStart);
  2947.      IF Extra^.SelectColumnEnd=0 THEN inc(Extra^.SelectColumnEnd);
  2948.      BufEnd:=LONGWORD(Buf)+Len;  {Highest buffer address}
  2949.      Extra^.Modified:=TRUE;
  2950.      s:=Extra^.ScreenBuffer[Extra^.CursorY-1];
  2951.      NewLStart:=Extra^.VSlider.AcValue+(Extra^.CursorY-1);
  2952.      x:=Extra^.CursorX+Extra^.HSlider.acvalue;
  2953.      s1:=copy(s,1,x-1);
  2954.      NewCStart:=Length(s1)+1;
  2955.      delete(s,1,x-1);
  2956.      WHILE s[length(s)]=#32 DO dec(s[0]);
  2957.  
  2958.      IF CountLines=1 THEN
  2959.      BEGIN
  2960.           GetBufferLine(s2,Buf,Len,BufEnd);
  2961.           IF Length(s2)>Extra^.SelectColumnStart-1 THEN
  2962.           BEGIN
  2963.                Delete(s2,1,Extra^.SelectColumnStart-1);
  2964.                ww:=Extra^.SelectColumnEnd-Extra^.SelectColumnStart;
  2965.                IF length(s2)>ww+1 THEN s2[0]:=chr(ww+1);
  2966.           END
  2967.           ELSE s2:='';
  2968.  
  2969.           WHILE s2[length(s2)]=#32 DO dec(s2[0]);
  2970.           NewCEnd:=Length(s1)+Length(s2);
  2971.           s:=s1+s2+s;
  2972.           WHILE Length(s)<250 DO s:=s+' ';
  2973.           IF Length(s)>250 THEN s[0]:=#250;
  2974.           Extra^.ScreenBuffer[Extra^.CursorY-1]:=s;
  2975.      END
  2976.      ELSE
  2977.      BEGIN
  2978.           IF s<>'' THEN
  2979.           BEGIN
  2980.                WHILE Length(s)<250 DO s:=s+' ';
  2981.                inc(Extra^.TextLines);
  2982.                AppendUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
  2983.                FOR t:=EditorMaxLines DOWNTO Extra^.CursorY+1 DO
  2984.                   Extra^.ScreenBuffer[t]:=Extra^.ScreenBuffer[t-1];
  2985.                Extra^.ScreenBuffer[Extra^.CursorY]:=s;
  2986.           END;
  2987.  
  2988.           GetBufferLine(s,Buf,Len,BufEnd);
  2989.           IF Length(s)>Extra^.SelectColumnStart-1 THEN
  2990.             Delete(s,1,Extra^.SelectColumnStart-1)
  2991.           ELSE s:='';
  2992.           s1:=s1+s;
  2993.           WHILE Length(s1)<250 DO s1:=s1+' ';
  2994.           IF Length(s1)>250 THEN s1[0]:=#250;
  2995.           Extra^.ScreenBuffer[Extra^.CursorY-1]:=s1;
  2996.  
  2997.           NewCEnd:=240;
  2998.  
  2999.           OldCursorY:=Extra^.CursorY;
  3000.           FOR t:=2 TO CountLines DO
  3001.           BEGIN
  3002.                IF Extra^.CursorY<=EditormaxLines THEN
  3003.                BEGIN
  3004.                     AppendUpperLine(Extra^.ScreenBuffer[EditorMaxLines],Extra);
  3005.                     IF Extra^.CursorY<EditorMaxLines THEN
  3006.                       FOR t1:=EditorMaxLines DOWNTO Extra^.CursorY+1 DO
  3007.                         Extra^.ScreenBuffer[t1]:=Extra^.ScreenBuffer[t1-1];
  3008.                     GetBufferLine(s,Buf,Len,BufEnd);
  3009.                     Extra^.ScreenBuffer[Extra^.CursorY]:=s;
  3010.                END
  3011.                ELSE
  3012.                BEGIN
  3013.                     BLen:=BufEnd-LONGWORD(Buf); {remaining bytes in buffer}
  3014.                     r:=Extra^.TextHigh-Blen;
  3015.                     IF r<Extra^.TextLow THEN ExtendEditor(Extra);
  3016.                     IF r-Extra^.TextLow<SafetyBufSize THEN ExtendEditor(Extra);
  3017.                     Extra^.SelectHiAddr:=Extra^.TextHigh+1;
  3018.                     dec(Extra^.TextHigh,BLen-1);
  3019.                     pb:=POINTER(Extra^.TextHigh);
  3020.                     Move(Buf^,pb^,BLen);
  3021.                     dec(Extra^.TextHigh);
  3022.                     inc(Extra^.TextLines,(CountLines-t));
  3023.                     t:=CountLines; {End of loop}
  3024.                END;
  3025.                inc(Extra^.CursorY);
  3026.                inc(Extra^.TextLines);
  3027.           END;
  3028.           Extra^.CursorY:=OldCursorY;
  3029.           SetSliderValues(Win,Extra);
  3030.      END;
  3031.      Extra^.SelectLineStart:=NewLStart;
  3032.      Extra^.SelectLineEnd:=NewLStart+(CountLines-1);
  3033.      Extra^.SelectColumnStart:=NewCStart;
  3034.      Extra^.SelectColumnEnd:=NewCEnd;
  3035. END;
  3036.  
  3037. PROCEDURE TEditorApplication.InsertText(Win:HWND;Extra:PEditor);
  3038. VAR
  3039.    p:PTextBuf;
  3040.    Len:LONGWORD;
  3041.    CountLines:WORD;
  3042. BEGIN
  3043.      p:=CopySelectedText(Win,Extra,Len);
  3044.      IF p=NIL THEN exit;
  3045.      CountLines:=(Extra^.SelectLineEnd-Extra^.SelectLineStart)+1;
  3046.      PutText(Win,Extra,p,Len,CountLines);
  3047.      Freemem(p,Len);
  3048.      InvalidateEditorWindow(Win,Extra);
  3049. END;
  3050.  
  3051.  
  3052.  
  3053. PROCEDURE TEditorApplication.MDIHandleScanEvent(Win:HWND;scan:Word;Data:POINTER);
  3054. VAR hsp:LONGWORD;
  3055.     r:LongWord;
  3056.     x,y:LONGWORD;
  3057.     s,s1:string;
  3058.     t,t1:WORD;
  3059.     ScrollWin,FrameWin:HWND;
  3060.     p:POINTER;
  3061.     ww,ww1,NewX:WORD;
  3062.     rc:RECTL;
  3063.     Extra1:PEditor;
  3064.     _Insert,Indent,Backups,SynHigh:BOOLEAN;
  3065.     ShiftSelect:BOOLEAN;
  3066. Label lfound,lend,lstart,rend,rstart,cl,cr,cu,cd,sl;
  3067. BEGIN
  3068.      Inherited.MDIHandleScanEvent(Win,scan,Data);
  3069.      Extra1:=Data;
  3070.      Extra1^.ErrorMode:=FALSE;
  3071.      ClearErrorLine(Win,Data);
  3072.      ShiftSelect:=FALSE;
  3073.      CASE Scan OF
  3074.          kbShiftCLeft:
  3075.          BEGIN
  3076.               ShiftSelect:=TRUE;
  3077.               IF extra1^.SelectLineStart=65535 THEN
  3078.               BEGIN
  3079.                    Extra1^.SelectLineStart:=Extra1^.VSlider.acvalue+
  3080.                       Extra1^.CursorY;
  3081.                    dec(Extra1^.SelectLineStart);
  3082.                    Extra1^.SelectColumnStart:=Extra1^.HSlider.acvalue+
  3083.                       Extra1^.CursorX;
  3084.                    Extra1^.SelectLineEnd:=Extra1^.SelectLineStart;
  3085.                    Extra1^.SelectColumnEnd:=Extra1^.SelectColumnStart;
  3086.               END;
  3087.               goto cl;
  3088.          END;
  3089.          kbShiftCRight:
  3090.          BEGIN
  3091.               ShiftSelect:=TRUE;
  3092.               IF extra1^.SelectLineStart=65535 THEN
  3093.               BEGIN
  3094.                    Extra1^.SelectLineStart:=Extra1^.VSlider.acvalue+
  3095.                       Extra1^.CursorY;
  3096.                    dec(Extra1^.SelectLineStart);
  3097.                    Extra1^.SelectColumnStart:=Extra1^.HSlider.acvalue+
  3098.                       Extra1^.CursorX;
  3099.                    Extra1^.SelectLineEnd:=Extra1^.SelectLineStart;
  3100.                    Extra1^.SelectColumnEnd:=Extra1^.SelectColumnStart;
  3101.               END;
  3102.               goto cr;
  3103.          END;
  3104.          kbShiftCUp:
  3105.          BEGIN
  3106.               ShiftSelect:=TRUE;
  3107.               IF extra1^.SelectLineStart=65535 THEN
  3108.               BEGIN
  3109.                    Extra1^.SelectLineStart:=Extra1^.VSlider.acvalue+
  3110.                       Extra1^.CursorY;
  3111.                    dec(Extra1^.SelectLineStart);
  3112.                    Extra1^.SelectColumnStart:=Extra1^.HSlider.acvalue+
  3113.                       Extra1^.CursorX;
  3114.                    Extra1^.SelectLineEnd:=Extra1^.SelectLineStart;
  3115.                    Extra1^.SelectColumnEnd:=Extra1^.SelectColumnStart;
  3116.               END;
  3117.               goto cu;
  3118.          END;
  3119.          kbShiftCDown:
  3120.          BEGIN
  3121.               ShiftSelect:=TRUE;
  3122.               IF extra1^.SelectLineStart=65535 THEN
  3123.               BEGIN
  3124.                    Extra1^.SelectLineStart:=Extra1^.VSlider.acvalue+
  3125.                       Extra1^.CursorY;
  3126.                    dec(Extra1^.SelectLineStart);
  3127.                    Extra1^.SelectColumnStart:=Extra1^.HSlider.acvalue+
  3128.                       Extra1^.CursorX;
  3129.                    Extra1^.SelectLineEnd:=Extra1^.SelectLineStart;
  3130.                    Extra1^.SelectColumnEnd:=Extra1^.SelectColumnStart;
  3131.               END;
  3132.               goto cd;
  3133.          END;
  3134.          kbCtrlKC:InsertText(Win,Data);
  3135.          kbCtrlKB:
  3136.          BEGIN
  3137.               Extra1^.SelectLineStart:=Extra1^.VSlider.acvalue+
  3138.                        Extra1^.CursorY;
  3139.               dec(Extra1^.SelectLineStart);
  3140.               Extra1^.SelectColumnStart:=Extra1^.HSlider.acvalue+
  3141.                        Extra1^.CursorX;
  3142.               Extra1^.SelectLineEnd:=Extra1^.SelectLineStart;
  3143.               Extra1^.SelectColumnEnd:=Extra1^.SelectColumnStart;
  3144.               InvalidateEditorWindow(Win,Extra1);
  3145.          END;
  3146.          kbCtrlKK:
  3147.          BEGIN
  3148. sl:
  3149.               IF Extra1^.SelectLineStart<65535 THEN
  3150.               BEGIN
  3151.                    ww:=Extra1^.VSlider.acvalue+Extra1^.CursorY;
  3152.                    dec(ww);
  3153.                    ww1:=Extra1^.HSlider.acvalue+Extra1^.CursorX;
  3154.                    dec(ww1);
  3155.                    IF ww<Extra1^.SelectLineStart THEN
  3156.                    BEGIN
  3157.                         Extra1^.SelectLineStart:=ww;
  3158.                         Extra1^.SelectColumnStart:=ww1+1;
  3159.                    END
  3160.                    ELSE
  3161.                    BEGIN
  3162.                         IF ww>Extra1^.SelectLineStart THEN
  3163.                         BEGIN
  3164.                              Extra1^.SelectLineEnd:=ww;
  3165.                              Extra1^.SelectColumnEnd:=ww1;
  3166.                         END
  3167.                         ELSE
  3168.                         BEGIN
  3169.                              IF ww1>Extra1^.SelectColumnStart-1 THEN
  3170.                                Extra1^.SelectColumnEnd:=ww1
  3171.                              ELSE Extra1^.SelectColumnStart:=ww1+1;
  3172.                         END;
  3173.                    END;
  3174.                    InvalidateEditorWindow(Win,Extra1);
  3175.               END;
  3176.          END;
  3177.          kbCtrlA,kbCtrlCLeft: {Word left}
  3178.          BEGIN
  3179.               y:=Extra1^.CursorY-1;
  3180.               s:=Extra1^.ScreenBuffer[y];
  3181.               while s[length(s)]=#32 do dec(s[0]);
  3182.  
  3183.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  3184.               IF x>length(s) THEN x:=length(s);
  3185.  
  3186.               IF x<=1 THEN
  3187.               BEGIN
  3188. lend:
  3189.                    {Move to end of previous line}
  3190.                    IF Extra1^.CursorY=1 THEN
  3191.                    BEGIN
  3192.                         IF Extra1^.VSlider.acvalue=0 THEN exit;
  3193.                         LineUp(Win,Extra1);
  3194.                         InvalidateEditorWindow(Win,Extra1);
  3195.                    END
  3196.                    ELSE LineUp(Win,Extra1);
  3197.                    y:=Extra1^.CursorY-1;
  3198.                    s:=Extra1^.ScreenBuffer[y];
  3199.                    while s[length(s)]=#32 do dec(s[0]);
  3200.                    x:=length(s)+1;
  3201.                    goto lfound;
  3202.               END;
  3203.  
  3204.               FOR t:=x-1 downto 1 DO
  3205.               BEGIN
  3206.                    CASE s[t] OF
  3207.                      'A'..'Z','a'..'z','0'..'9','_':goto lstart;
  3208.                      ELSE IF x>0 THEN dec(x);
  3209.                    END; {case}
  3210.               END;
  3211. lstart:
  3212.               IF x<=1 THEN goto lend;
  3213.               FOR t:=x-1 downto 1 DO
  3214.               BEGIN
  3215.                    CASE s[t] OF
  3216.                      ' '..'/',':'..'@','['..#96,'{'..#255:
  3217.                      BEGIN
  3218.                           x:=t+1;
  3219.                           goto lfound;
  3220.                      END;
  3221.                    END; {case}
  3222.               END;
  3223.               x:=1;
  3224. lfound:
  3225.               Extra1^.CursorX:=x;
  3226.               r:=Extra1^.HSlider.acvalue;
  3227.               Extra1^.HSlider.acvalue:=0;
  3228.               IF CheckIfToScrollX(Win,Extra1,TRUE) THEN exit;
  3229.               IF r<>0 THEN
  3230.               BEGIN
  3231.                    InvalidateEditorWindow(Win,Extra1);
  3232.                    exit;
  3233.               END;
  3234.          END;
  3235.          kbCtrlF,kbCtrlCRight: {Word right}
  3236.          BEGIN
  3237.               y:=Extra1^.CursorY-1;
  3238.               s:=Extra1^.ScreenBuffer[y];
  3239.               while s[length(s)]=#32 do dec(s[0]);
  3240.  
  3241.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  3242.               IF x>length(s) THEN x:=length(s);
  3243.  
  3244.               IF x>=length(s) THEN
  3245.               BEGIN
  3246. rend:
  3247.                    {Move to start of next line}
  3248.                    Extra1^.CursorX:=1;
  3249.                    Extra1^.HSlider.AcValue:=0;
  3250.                    IF Extra1^.CursorY=Extra1^.TextViewY THEN
  3251.                    BEGIN
  3252.                        LineDown(Win,Extra1,TRUE);
  3253.                        InvalidateEditorWindow(Win,Data);
  3254.                        exit;
  3255.                    END
  3256.                    ELSE LineDown(Win,Extra1,TRUE);
  3257.                    x:=1;
  3258.                    goto lfound;
  3259.               END;
  3260.  
  3261.               FOR t:=x+1 to length(s) DO
  3262.               BEGIN
  3263.                    CASE s[t] OF
  3264.                      'A'..'Z','a'..'z','0'..'9','_':goto rstart;
  3265.                      ELSE IF x<length(s) THEN inc(x);
  3266.                    END; {case}
  3267.               END;
  3268. rstart:
  3269.               IF x>=length(s) THEN goto rend;
  3270.               FOR t:=x+1 to length(s) DO
  3271.               BEGIN
  3272.                    CASE s[t] OF
  3273.                      ' '..'/',':'..'@','['..#96,'{'..#255:
  3274.                      BEGIN
  3275.                           x:=t+1;
  3276.                           IF s[x] IN ['A'..'Z','a'..'z','0'..'9','_']
  3277.                              THEN goto lfound;
  3278.                      END;
  3279.                    END; {case}
  3280.               END;
  3281.               x:=length(s)+1;
  3282.               goto lfound;
  3283.          END;
  3284.          kbCtrlPos1:Extra1^.CursorY:=1;
  3285.          kbCtrlEnd:Extra1^.CursorY:=Extra1^.TextViewY;
  3286.          kbCtrlPageUp:GotoLine(Extra1,1,1);     {Start of text}
  3287.          kbCtrlPageDown:GotoLine(Extra1,65530,1);
  3288.          kbAlt0:
  3289.          BEGIN
  3290.               r:=CM_LIST;
  3291.               WinSendMsg(NIL,POINTER(r),WM_COMMAND,ClientHandle);
  3292.               exit;
  3293.          END;
  3294.          kbCtrlY,kbCtrlZ:
  3295.          BEGIN
  3296.               Extra1^.Modified:=TRUE;
  3297.               FOR t:=Extra1^.CursorY-1 TO EditorMaxLines-1 DO
  3298.                 Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t+1];
  3299.               IF GetUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1)
  3300.                THEN Dec(Extra1^.TextLines);
  3301.               InvalidateEditorWindow(Win,Extra1);
  3302.          END;
  3303.          kbCDown,kbCtrlX:
  3304.          BEGIN
  3305. cd:
  3306.               IF Extra1^.CursorY=Extra1^.TextViewY THEN
  3307.               BEGIN
  3308.                    LineDown(Win,Extra1,TRUE);
  3309.                    IF ShiftSelect THEN goto sl;
  3310.                    InvalidateEditorWindow(Win,Data);
  3311.                    exit;
  3312.               END
  3313.               ELSE LineDown(Win,Extra1,FALSE);
  3314.               IF ShiftSelect THEN goto sl;
  3315.          END;
  3316.          kbCUp,kbCtrlE:
  3317.          BEGIN
  3318. cu:
  3319.               IF Extra1^.CursorY=1 THEN
  3320.               BEGIN
  3321.                    IF Extra1^.VSlider.acvalue=0 THEN exit;
  3322.                    LineUp(Win,Extra1);
  3323.                    IF ShiftSelect THEN goto sl;
  3324.                    InvalidateEditorWindow(Win,Extra1);
  3325.                    exit;
  3326.               END
  3327.               ELSE LineUp(Win,Extra1);
  3328.               IF ShiftSelect THEN goto sl;
  3329.          END;
  3330.          kbCR,kbCtrlN:
  3331.          BEGIN
  3332.               IF Extra1^.InsertMode THEN
  3333.               BEGIN
  3334.                    GetEditorOptions(_Insert,Indent,SynHigh,BackUps);
  3335.                    Extra1^.CursorX:=1;
  3336.                    Extra1^.HSlider.acvalue:=0;
  3337.                    IF Extra1^.CursorY=Extra1^.TextViewY THEN
  3338.                    BEGIN
  3339.                         LineDown(Win,Extra1,FALSE);
  3340.                         IF Indent THEN
  3341.                         BEGIN
  3342.                              s:=Extra1^.ScreenBuffer[Extra1^.CursorY-1];
  3343.                              WHILE s[length(s)]=#32 DO dec(s[0]);
  3344.                              FOR t:=1 TO length(s) DO
  3345.                              BEGIN
  3346.                                   IF s[t]<>#32 THEN
  3347.                                   BEGIN
  3348.                                        Extra1^.CursorX:=t;
  3349.                                        t:=length(s);
  3350.                                   END;
  3351.                              END;
  3352.                         END;
  3353.                         InvalidateEditorWindow(Win,Data);
  3354.                         exit;
  3355.                    END
  3356.                    ELSE
  3357.                    BEGIN
  3358.                         IF Indent THEN
  3359.                         BEGIN
  3360.                              s:=Extra1^.ScreenBuffer[Extra1^.CursorY];
  3361.                              WHILE s[length(s)]=#32 DO dec(s[0]);
  3362.                              FOR t:=1 TO length(s) DO
  3363.                              BEGIN
  3364.                                 IF s[t]<>#32 THEN
  3365.                                 BEGIN
  3366.                                      Extra1^.CursorX:=t;
  3367.                                      t:=length(s);
  3368.                                END;
  3369.                              END;
  3370.                         END;
  3371.                         LineDown(Win,Extra1,FALSE);
  3372.                    END;
  3373.               END
  3374.               ELSE
  3375.               BEGIN
  3376.                    GetEditorOptions(_Insert,Indent,SynHigh,BackUps);
  3377.                    Extra1^.Modified:=TRUE;
  3378.                    s:=Extra1^.ScreenBuffer[Extra1^.CursorY-1];
  3379.                    NewX:=1;
  3380.                    IF Indent THEN
  3381.                    BEGIN
  3382.                        s1:=s;
  3383.                        WHILE s1[length(s1)]=#32 DO dec(s1[0]);
  3384.                        FOR t:=1 TO length(s1) DO
  3385.                        BEGIN
  3386.                            IF s1[t]<>#32 THEN
  3387.                            BEGIN
  3388.                                NewX:=t;
  3389.                                t:=length(s1);
  3390.                            END;
  3391.                        END;
  3392.                    END;
  3393.                    x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  3394.                    s1:=copy(s,1,x-1);
  3395.                    WHILE Length(s1)<250 DO s1:=s1+' ';
  3396.                    Extra1^.ScreenBuffer[Extra1^.CursorY-1]:=s1;
  3397.                    delete(s,1,x-1);
  3398.                    WHILE s[length(s)]=#32 DO dec(s[0]);
  3399.                    inc(Extra1^.CursorY);
  3400.                    Extra1^.CursorX:=NewX;
  3401.                    Extra1^.HSlider.acvalue:=0;
  3402.                    inc(Extra1^.TextLines);
  3403.                    SetSliderValues(Win,Extra1);
  3404.                    AppendUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1);
  3405.                    FOR t:=EditorMaxLines DOWNTO Extra1^.CursorY DO
  3406.                     Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t-1];
  3407.                    IF NewX>1 THEN FOR t:=2 TO NewX DO s:=' '+s;
  3408.                    WHILE Length(s)<250 DO s:=s+' ';
  3409.                    Extra1^.ScreenBuffer[Extra1^.CursorY-1]:=s;
  3410.                    Dec(Extra1^.CursorY);
  3411.                    LineDown(Win,Extra1,FALSE);
  3412.                    InvalidateEditorWindow(Win,Data);
  3413.               END;
  3414.          END;
  3415.          kbPageDown,kbCtrlC:
  3416.          BEGIN
  3417.               PageDown(Win,Extra1);
  3418.               InvalidateEditorWindow(Win,Extra1);
  3419.               exit;
  3420.          END;
  3421.          kbPageUp,kbCtrlR:
  3422.          BEGIN
  3423.               PageUp(Win,Extra1);
  3424.               InvalidateEditorWindow(Win,Extra1);
  3425.               exit;
  3426.          END;
  3427.          kbCRight,kbCtrlD:
  3428.          BEGIN
  3429. cr:
  3430.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  3431.               IF x>=Extra1^.HSlider.ScrollTop THEN exit;
  3432.               inc(Extra1^.CursorX);
  3433.               IF CheckIfToScrollX(Win,Extra1,FALSE) THEN
  3434.               BEGIN
  3435.                   IF ShiftSelect THEN goto sl;
  3436.                   InvalidateEditorWindow(Win,Extra1);
  3437.                   exit;
  3438.               END;
  3439.               IF ShiftSelect THEN goto sl;
  3440.          END;
  3441.          kbCLeft,kbCtrlS:
  3442.          BEGIN
  3443. cl:
  3444.               IF Extra1^.CursorX=1 THEN
  3445.               BEGIN
  3446.                    IF Extra1^.HSlider.acvalue=0 THEN exit;
  3447.                    dec(Extra1^.HSlider.acvalue);
  3448.                    IF ShiftSelect THEN goto sl;
  3449.                    InvalidateEditorWindow(Win,Extra1);
  3450.                    exit;
  3451.               END
  3452.               ELSE dec(Extra1^.CursorX);
  3453.               IF ShiftSelect THEN goto sl;
  3454.          END;
  3455.          kbPos1:
  3456.          BEGIN
  3457.               Extra1^.CursorX:=1;
  3458.               r:=Extra1^.HSlider.acvalue;
  3459.               Extra1^.HSlider.acvalue:=0;
  3460.               if r<>0 THEN
  3461.               BEGIN
  3462.                    InvalidateEditorWindow(Win,Extra1);
  3463.                    exit;
  3464.               END;
  3465.          END;
  3466.          kbEnd:
  3467.          BEGIN
  3468.               x:=Extra1^.CursorY-1;
  3469.               s:=Extra1^.ScreenBuffer[x];
  3470.               while s[length(s)]=#32 do dec(s[0]);
  3471.               Extra1^.CursorX:=length(s)+1;
  3472.               r:=Extra1^.HSlider.acvalue;
  3473.               Extra1^.HSlider.acvalue:=0;
  3474.               IF CheckIfToScrollX(Win,Extra1,TRUE) THEN exit;
  3475.               IF r<>0 THEN
  3476.               BEGIN
  3477.                    InvalidateEditorWindow(Win,Extra1);
  3478.                    exit;
  3479.               END;
  3480.          END;
  3481.          kbDel,kbCtrlG:
  3482.          BEGIN
  3483.               Extra1^.Modified:=TRUE;
  3484.               y:=Extra1^.CursorY-1;
  3485.               s:=Extra1^.ScreenBuffer[y];
  3486.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  3487.               t1:=0;
  3488.               for t:=length(s) downto x do if s[t]<>#32 then t1:=t;
  3489.               if t1<x then
  3490.               begin
  3491.                    while s[length(s)]=#32 do dec(s[0]);
  3492.                    IF x>0 THEN IF length(s)<x THEN for t:=1 TO x do s:=s+' ';
  3493.                    s1:=Extra1^.ScreenBuffer[y+1];
  3494.                    while s1[length(s1)]=#32 do dec(s1[0]);
  3495.                    if length(s)+length(s1)>250 then s1[0]:=chr(250-length(s));
  3496.                    s:=s+s1;
  3497.                    while length(s)<250 do s:=s+' ';
  3498.                    Extra1^.ScreenBuffer[y]:=s;
  3499.                    FOR t:=y+1 TO EditorMaxLines-1 DO
  3500.                      Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t+1];
  3501.                    IF GetUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1)
  3502.                     THEN Dec(Extra1^.TextLines);
  3503.                    InvalidateEditorWindow(Win,Extra1);
  3504.               end
  3505.               else
  3506.               begin
  3507.                    delete(s,x,1);
  3508.                    s:=s+' ';
  3509.                    Extra1^.ScreenBuffer[y]:=s;
  3510.                    InvalidateEditorLine(Win,s,y+1,Extra1);
  3511.               end;
  3512.               exit;
  3513.          END;
  3514.          kbBS,kbCtrlH:
  3515.          BEGIN
  3516.               Extra1^.Modified:=TRUE;
  3517.               y:=Extra1^.CursorY-1;
  3518.               x:=Extra1^.CursorX+Extra1^.HSlider.acvalue;
  3519.               s:=Extra1^.ScreenBuffer[y];
  3520.               IF length(s)>=x-1 THEN IF x<>1 THEN delete(s,x-1,1);
  3521.               while length(s)<250 do s:=s+' ';
  3522.               Extra1^.ScreenBuffer[y]:=s;
  3523.               IF Extra1^.CursorX=1 THEN
  3524.               BEGIN
  3525.                    IF Extra1^.HSlider.acvalue>0 THEN dec(Extra1^.HSlider.acvalue)
  3526.                    ELSE
  3527.                    BEGIN
  3528.                         IF Extra1^.CursorY=1 THEN
  3529.                          IF Extra1^.VSlider.AcValue=0 THEN
  3530.                          BEGIN
  3531.                               InvalidateEditorWindow(Win,Extra1);
  3532.                               exit;
  3533.                          END;
  3534.                         {Delete actual line and jump to previous}
  3535.                         FOR t:=Extra1^.CursorY-1 TO EditorMaxLines-1 DO
  3536.                           Extra1^.ScreenBuffer[t]:=Extra1^.ScreenBuffer[t+1];
  3537.                         IF GetUpperLine(Extra1^.ScreenBuffer[EditorMaxLines],Extra1)
  3538.                           THEN Dec(Extra1^.TextLines);
  3539.                         LineUp(Win,Extra1);
  3540.                         x:=Extra1^.CursorY-1;
  3541.                         s:=Extra1^.ScreenBuffer[x];
  3542.                         while s[length(s)]=#32 do dec(s[0]);
  3543.                         Extra1^.CursorX:=length(s)+1;
  3544.                         r:=Extra1^.HSlider.acvalue;
  3545.                         Extra1^.HSlider.acvalue:=0;
  3546.                         IF CheckIfToScrollX(Win,Extra1,TRUE) THEN exit;
  3547.                         IF r<>0 THEN
  3548.                         BEGIN
  3549.                              InvalidateEditorWindow(Win,Extra1);
  3550.                              exit;
  3551.                         END;
  3552.                    END;
  3553.                    InvalidateEditorWindow(Win,Extra1);
  3554.                    exit;
  3555.               END
  3556.               ELSE
  3557.               BEGIN
  3558.                    dec(Extra1^.CursorX);
  3559.                    InvalidateEditorLine(Win,s,y+1,Extra1);
  3560.                    exit;
  3561.               END;
  3562.          END;
  3563.          kbCtrlIns:
  3564.          BEGIN
  3565.               r:=CM_COPY;
  3566.               WinSendMsg(NIL,POINTER(r),WM_COMMAND,ClientHandle);
  3567.          END;
  3568.          kbShiftDel:
  3569.          BEGIN
  3570.               r:=CM_CUT;
  3571.               WinSendMsg(NIL,POINTER(r),WM_COMMAND,ClientHandle);
  3572.          END;
  3573.          kbShiftIns:
  3574.          BEGIN
  3575.               r:=CM_PASTE;
  3576.               WinSendMsg(NIL,POINTER(r),WM_COMMAND,ClientHandle);
  3577.          END;
  3578.          kbInsert,kbCtrlV:
  3579.          BEGIN
  3580.               Extra1^.InsertMode:=not(Extra1^.InsertMode);
  3581.               IF Extra1^.InsertMode THEN r:=CharHeight
  3582.               ELSE r:=2;
  3583.               ASM
  3584.                   ;Destroy the cursor
  3585.                   PUSHL $Win
  3586.                   MOV AL,1
  3587.                   CALLDLL PMWIN,725  ;WinDestroyCursor
  3588.                   ADD ESP,4
  3589.  
  3590.                   ;Create the cursor
  3591.                   PUSHL 0  ;whole window
  3592.                   PUSHL 4  ;CURSOR_SOLID | CURSOR_FLASH
  3593.                   PUSHL $r ;Cursorheigth
  3594.                   PUSHL _CharWidth
  3595.                   PUSHL 40
  3596.                   PUSHL 40
  3597.                   PUSHL $Win
  3598.                   MOV AL,7
  3599.                   CALLDLL PMWIN,715  ;WinCreateCursor
  3600.                   ADD ESP,28
  3601.               END;
  3602.               WinShowCursor(1,Win);
  3603.          END;
  3604.          ELSE exit;
  3605.      END; {CASE}
  3606.      SetCursor(Win,Extra1);
  3607. END;
  3608.  
  3609.  
  3610. FUNCTION TEditorApplication.MDIHandleEvent(Win:HWND;Msg:LONGWORD;para1,
  3611.                       para2:POINTER;VAR Handled:BOOLEAN;
  3612.                       Data:POINTER):LONGWORD;
  3613. VAR r:LONGWORD;
  3614.     rc:RECTL;
  3615.     H:BOOLEAN;
  3616.     w:WORD;
  3617.     ch:CHAR;
  3618.     b:Byte;
  3619.     pp:PEditor;
  3620.     FrameWin,ScrollWin:HWND;
  3621.     ww,ww1:WORD;
  3622.     p:POINTER;
  3623.     po:points;
  3624.     lx,ly,wx,wy:Integer;
  3625. Label l,ll,ll1,sel;
  3626. BEGIN
  3627.      r:=Inherited.MDIHandleEvent(Win,Msg,para1,para2,Handled,Data);
  3628.      H:=TRUE;
  3629.      r:=0;
  3630.      CASE MSG OF
  3631.           WM_MOUSEMOVE:
  3632.           BEGIN
  3633.                IF NewEditorPtr<>0 THEN WinSetPointer(NewEditorPtr,HWND_DESKTOP)
  3634.                ELSE IF Not Handled THEN H:=FALSE;
  3635.                IF MouseButton1Down THEN goto sel;
  3636.           END;
  3637.           WM_SIZE:
  3638.           BEGIN
  3639.                SetSliderValues(Win,Data);
  3640.                IF not Handled THEN H:=FALSE;
  3641.           END;
  3642.           WM_DESTROY:
  3643.           BEGIN
  3644.                DestroyEditor(Data);
  3645.                IF not Handled THEN H:=FALSE;
  3646.           END;
  3647.           WM_HSCROLL:CheckHScrollBar(Win,para1,para2,Data);
  3648.           WM_VSCROLL:CheckVScrollBar(Win,para1,para2,Data);
  3649.           WM_SETFOCUS:  {EingabeFocus neu setzen}
  3650.           BEGIN
  3651.                pp:=Data;
  3652.                IF pp^.InsertMode THEN r:=CharHeight
  3653.                ELSE r:=2;
  3654.                ASM
  3655.                   MOV EAX,$Para2
  3656.                   CMP EAX,0
  3657.                   JE !dc      ;Window is loosing focus
  3658.  
  3659.                   ;Window becomes focus --> Create the cursor
  3660.                   PUSHL 0  ;whole window
  3661.                   PUSHL 4  ;CURSOR_SOLID | CURSOR_FLASH
  3662.                   PUSHL $r ;Cursorheigth
  3663.                   PUSHL _CharWidth
  3664.                   PUSHL 40
  3665.                   PUSHL 40
  3666.                   PUSHL $Win
  3667.                   MOV AL,7
  3668.                   CALLDLL PMWIN,715  ;WinCreateCursor
  3669.                   ADD ESP,28
  3670.                END;
  3671.                WinShowCursor(1,Win);
  3672.                SetCursor(Win,Data);
  3673.                InvalidateWindow(Win);
  3674.                goto l;
  3675.  
  3676.                ASM
  3677. !dc:
  3678.                   ;Window is loosing focus --> Destroy the cursor
  3679.                   PUSHL $Win
  3680.                   MOV AL,1
  3681.                   CALLDLL PMWIN,725  ;WinDestroyCursor
  3682.                   ADD ESP,4
  3683.                END;
  3684. l:
  3685.           END;
  3686.           WM_BUTTON1Up:WinSetCapture(HWND_DESKTOP,0);
  3687.           WM_BUTTON1Down,WM_BUTTON1Click:
  3688.           BEGIN
  3689.                pp:=Data;
  3690.                pp^.ErrorMode:=FALSE;
  3691.                ClearErrorLine(Win,pp);
  3692.                po:=Points(Para1);
  3693.                lx:=po.x DIV CharWidth;
  3694.                ly:=po.y DIV CharHeight;
  3695.                WinQueryWindowrect(rc,Win);
  3696.                wx:=(rc.xright-rc.xleft) DIV CharWidth;
  3697.                wy:=(rc.ytop-rc.ybottom) DIV CharHeight;
  3698.                inc(lx);
  3699.                if lx>wx then lx:=wx;
  3700.                ly:=wy-ly;
  3701.                if ly<1 then ly:=1;
  3702.                pp:=Data;
  3703.                pp^.SelectColumnStart:=65535;
  3704.                pp^.SelectLineStart:=65535;
  3705.                pp^.SelectColumnEnd:=65535;
  3706.                pp^.SelectLineEnd:=65535;
  3707.                pp^.SelectLoAddr:=0;
  3708.                pp^.SelectHiAddr:=0;
  3709.                IF lx=pp^.CursorX THEN IF ly=pp^.Cursory THEN goto ll;
  3710.                pp^.CursorX:=lx;
  3711.                pp^.CursorY:=ly;
  3712.                SetCursor(Win,pp);
  3713.                InvalidateEditorWindow(Win,pp)
  3714. ll:
  3715.                IF not Handled THEN H:=FALSE;
  3716.                IF Msg=WM_BUTTON1DOWN THEN WinSetCapture(HWND_DESKTOP,Win);
  3717.           END;
  3718.           WM_MOUSEDRAG1:
  3719.           BEGIN
  3720. sel:
  3721.                po:=Points(Para1);
  3722.                lx:=po.x DIV CharWidth;
  3723.                ly:=po.y DIV CharHeight;
  3724.                WinQueryWindowrect(rc,Win);
  3725.                wx:=(rc.xright-rc.xleft) DIV CharWidth;
  3726.                wy:=(rc.ytop-rc.ybottom) DIV CharHeight;
  3727.                inc(lx);
  3728.                if lx>wx then lx:=wx;
  3729.                ly:=wy-ly;
  3730.                if ly<1 then ly:=1;
  3731.                pp:=Data;
  3732.                IF lx=pp^.CursorX THEN IF ly=pp^.Cursory THEN
  3733.                  IF ly<pp^.TextViewY-1 THEN IF ly>1 THEN goto ll1;
  3734.                pp^.CursorX:=lx;
  3735.                pp^.CursorY:=ly;
  3736.                SetCursor(Win,pp);
  3737.  
  3738.                ww:=pp^.HSlider.acvalue+pp^.CursorX-1;
  3739.                ww1:=pp^.vSlider.acvalue+pp^.CursorY-1;
  3740.  
  3741.                IF pp^.SelectLineStart=65535 THEN
  3742.                BEGIN
  3743.                     pp^.SelectLineStart:=ww1;
  3744.                     pp^.SelectAnchorLine:=ww1;
  3745.                END;
  3746.  
  3747.                IF ww1>=pp^.SelectAnchorLine THEN
  3748.                BEGIN
  3749.                     pp^.SelectLineEnd:=ww1;
  3750.                     pp^.SelectLineStart:=pp^.SelectAnchorLine;
  3751.                END;
  3752.                ELSE
  3753.                BEGIN
  3754.                     pp^.SelectLineStart:=ww1;
  3755.                     pp^.SelectLineEnd:=pp^.SelectAnchorLine;
  3756.                END;
  3757.  
  3758.                IF pp^.SelectColumnStart=65535 THEN
  3759.                BEGIN
  3760.                     pp^.SelectColumnStart:=ww;
  3761.                     pp^.SelectAnchorColumn:=ww;
  3762.                END;
  3763.  
  3764.                IF ww1=pp^.SelectLineStart THEN
  3765.                BEGIN
  3766.                     IF ww>=pp^.SelectAnchorColumn THEN
  3767.                     BEGIN
  3768.                         IF ww1=pp^.SelectLineEnd THEN pp^.SelectColumnEnd:=ww;
  3769.                         pp^.SelectColumnStart:=pp^.SelectAnchorColumn;
  3770.                     END;
  3771.                     ELSE
  3772.                     BEGIN
  3773.                         pp^.SelectColumnStart:=ww;
  3774.                         IF ww1=pp^.SelectLineEnd THEN pp^.SelectColumnEnd:=
  3775.                                pp^.SelectAnchorColumn;
  3776.                     END;
  3777.                END;
  3778.  
  3779.                IF ww1=pp^.SelectLineEnd THEN IF ww1<>pp^.SelectLineStart THEN
  3780.                    pp^.SelectColumnEnd:=ww;
  3781.  
  3782.                dec(ww1,pp^.VSlider.AcValue);
  3783.  
  3784.                IF ww1>=pp^.TextViewY-1 THEN
  3785.                BEGIN
  3786.                     LineDown(Win,pp,TRUE);
  3787.                     LastDragPos:=para1;
  3788.                     DragWindow:=Win;
  3789.                     Drag_Mode:=TRUE;
  3790.                END
  3791.                ELSE
  3792.                BEGIN
  3793.                     IF ww1=0 THEN
  3794.                     BEGIN
  3795.                          LineUp(Win,pp);
  3796.                          LastDragPos:=para1;
  3797.                          DragWindow:=Win;
  3798.                          Drag_Mode:=TRUE;
  3799.                     END
  3800.                     ELSE Drag_Mode:=FALSE;
  3801.                END;
  3802.                InvalidateEditorWindow(Win,pp);
  3803. ll1:
  3804.                IF not Handled THEN H:=FALSE;
  3805.           END;
  3806.           ELSE IF not Handled THEN H:=FALSE;
  3807.      END; {Case}
  3808.      Handled:=H;
  3809.      MDIHandleEvent:=r;
  3810. END;
  3811.  
  3812. BEGIN
  3813. END.