[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]

    {+--------------------------------------------------------------------------+
     | Class:       TIDEStream
     | Created:     8.97
     | Author:      Martin Waldenburg
     | Copyright    1997, all rights reserved.
     | Description: A simple and effective interface to the IDE's text buffer
     | Version:     1.0
     | Status:      FreeWare
     | Disclaimer:
     | This is provided as is, expressly without a warranty of any kind.
     | You use it at your own risc.
     +--------------------------------------------------------------------------+}
    unit mwIDEStream;  { demo program below !! }

    interface

    uses
      Windows,
      SysUtils,
      Messages,
      Classes,
      ToolIntf,
      EditIntf,
      ExptIntf;

    type
      TIDEStream = class(TMemoryStream)
      private
        fStreamTextLen:Longint;
        function GetAsPChar:PChar;
      protected
      public
        constructor Create;
        destructor Destroy; override;
        procedure WriteText(Text: PChar);
        property Capacity;
        property AsPChar:PChar read GetAsPChar;
        function GetText:PChar;
        property StreamTextLen:Longint read fStreamTextLen;
      published
      end;

    var
      fToolServices : TIToolServices;
      fModuleInterface: TIModuleInterface;
      fEditorInterface: TIEditorInterface;
      ActualReader: TIEditReader;
      ActualWriter: TIEditWriter;

    implementation

    function GetProjectName: String;
    begin
      Result:= fToolServices.GetProjectName;
    end;  { GetProjectName }

    function GetCurrentFile: String;
    begin
      Result:= fToolServices.GetCurrentFile;
    end;   { GetCurrentFile }

    function GetToolServieces:TIToolServices;
    var
      FileExt: String;
    begin
      fToolServices:= ExptIntf.ToolServices;
     if GetProjectName = '' then raise exception.create('Sorry, a project must be open');
       FileExt:= ExtractFileExt(GetCurrentFile);
      if FileExt = '.dfm' then raise exception.create('Sorry, must be a PAS or DPR file');

    end;  { GetToolServieces }

    procedure GetEditReader;
    begin
      GetToolServieces;
      fModuleInterface:= fToolServices.GetModuleInterface(GetCurrentFile);
      fEditorInterface:= fModuleInterface.GetEditorInterface;
      ActualReader:= fEditorInterface.CreateReader;
    end;  { GetEditReader }

    procedure GetEditWriter;
    begin
      GetToolServieces;
      fModuleInterface:= fToolServices.GetModuleInterface(GetCurrentFile);
      fEditorInterface:= fModuleInterface.GetEditorInterface;
      ActualWriter:= fEditorInterface.CreateWriter;
    end;  { GetEditWriter }

    procedure FreeEditReader;
    begin
      ActualReader.Free;
      fEditorInterface.Free;
      fModuleInterface.Free;
    end;  { GetEditorInterface }

    procedure FreeEditWriter;
    begin
      ActualWriter.Free;
      fEditorInterface.Free;
      fModuleInterface.Free;
    end;  { GetEditorInterface }

    destructor TIDEStream.Destroy;
    begin
      inherited Destroy;
    end;  { Destroy }

    constructor TIDEStream.Create;
    begin
      inherited Create;
      fStreamTextLen:= 0;
    end;  { Create }

    function TIDEStream.GetAsPChar:PChar;
    const
      TheEnd: Char = #0;
    begin
      Position:= Size;
      Write(TheEnd, 1);
      SetPointer(Memory, Size -1);
      Result:= Memory;
    end;  { GetAsPChar }

    function TIDEStream.GetText:PChar;
    const
      BuffLen = 16383;
    var
      TextBuffer: PChar;
      Readed, BuffPos: LongInt;
    begin
      Clear;
      GetMem(TextBuffer, BuffLen +1);
      BuffPos:= 0;
      GetEditReader;
      try
        repeat
          Readed:= ActualReader.GetText(BuffPos, TextBuffer, Bufflen);
          Write(TextBuffer^, Readed);
          inc(BuffPos, Readed);
        until Readed < BuffLen;
      finally
      FreeEditReader;
      FreeMem(TextBuffer, BuffLen +1);
      end;
      fStreamTextLen:= Size;
      Result:= AsPchar;
    end;

    procedure TIDEStream.WriteText(Text: PChar);
    begin
      GetEditWriter;
      try
        ActualWriter.CopyTo(0);
        ActualWriter.DeleteTo(fStreamTextLen -1);
        ActualWriter.Insert(Text);
      finally
        FreeEditWriter;
      end;
    end;

    end.

    unit mwIDEExpert;
    {+--------------------------------------------------------------------------+
     | Unit:        mwIDEExpert
     | Created:     8.97
     | Author:      Martin Waldenburg
     | Copyright    1997, all rights reserved.
     | Description: A simple demo for TIDEStream
     | Version:     1.0
     | Status:      FreeWare
     | Disclaimer:
     | This is provided as is, expressly without a warranty of any kind.
     | You use it at your own risc.
     +--------------------------------------------------------------------------+}

    interface  { DFM file is included below - use XX34 to extract it }

    uses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, ExptIntf, ToolIntf, mwIDEStream, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;

      TMyIDEExpertExpert = class(TIExpert)
      private
        MenuItem: TIMenuItemIntf;
      protected
        procedure OnClick( Sender: TIMenuItemIntf); virtual;
      public
        constructor Create; virtual;
        destructor Destroy; override;
        function GetName: string; override;
        function GetAuthor: string; override;
        function GetStyle: TExpertStyle; override;
        function GetIDString: string; override;
      end;

    procedure Register;

    implementation

    {$R *.DFM}

    procedure Register;
    begin
      RegisterLibraryExpert(TMyIDEExpertExpert.Create);
    end;

    { TMyIDEExpertExpert code }
    function TMyIDEExpertExpert.GetName: String;
    begin
      Result := 'MyIDEExpertExpert'
    end;

    function TMyIDEExpertExpert.GetAuthor: String;
    begin
      Result := 'Martin_Waldenburg'; { author }
    end;

    function TMyIDEExpertExpert.GetStyle: TExpertStyle;
    begin
      Result := esAddIn;
    end;

    function TMyIDEExpertExpert.GetIDString: String;
    begin
      Result := 'private.MyIDEExpertExpert';
    end;

    constructor TMyIDEExpertExpert.Create;
    var
      Main: TIMainMenuIntf;
      ReferenceMenuItem: TIMenuItemIntf;
      Menu: TIMenuItemIntf;
    begin
      inherited Create;
      MenuItem := nil;
      if ToolServices <> nil then begin { I'm an expert! }
        Main := ToolServices.GetMainMenu;
        if Main <> nil then begin { we've got the main menu! }
          try
            { add the menu of your choice }
            ReferenceMenuItem := Main.FindMenuItem('ToolsOptionsItem');
            if ReferenceMenuItem <> nil then
            try
              Menu := ReferenceMenuItem.GetParent;
              if Menu <> nil then
              try
                MenuItem := Menu.InsertItem(ReferenceMenuItem.GetIndex+1,
                                  'MyIDEExpert',
                                  'MyIDEExpertExpertItem','',
                                  0,0,0,
                                  [mfEnabled, mfVisible], OnClick);
              finally
                Menu.DestroyMenuItem;
              end;
            finally
              ReferenceMenuItem.DestroyMenuItem;
            end;
          finally
            Main.Free;
          end;
        end;
      end;
    end;

    destructor TMyIDEExpertExpert.Destroy;
    begin
      if MenuItem <> nil then
        MenuItem.DestroyMenuItem;
      inherited Destroy;
    end;{Destroy}

    procedure TMyIDEExpertExpert.OnClick( Sender: TIMenuItemIntf);
    begin
      with TForm1.Create(Application) do
        try
          { do your processing here }
          ShowModal;
        finally
          Free;
        end;
    end;

    { TForm1 code }

    procedure TForm1.Button1Click(Sender: TObject);
    var
      IDEStream: TIDEStream;
      StreamText, UText, UFind, fReplace: String;
      FindLen, P: LongInt;
    begin
      IDEStream:= TIDEStream.Create;
      StreamText:= IDEStream.GetText;
      UText:= UpperCase(StreamText);
      UFind:= UpperCase(Trim(Edit1.Text));
      fReplace:= Trim(Edit2.Text);
      FindLen:= Length(UFind);
      P:= Pos(UFind, UText);
      if P <> 0 then
      begin
        Delete(StreamText, P, FindLen);
        Insert(fReplace, StreamText, P);
        IDEStream.WriteText(PChar(StreamText));
      end;
      IDEStream.Free;
    end;

    end.

    { the following contains additional files that should be included with this
      file.  To extract, you need XX3402 available with the SWAG distribution.

      1.     Cut the text below out, and save to a file  ..  filename.xx
      2.     Use XX3402  :   xx3402 d filename.xx
      3.     The decoded file should be created in the same directory.
      4.     If the file is a archive file, use the proper archive program to
             extract the members.

    { ------------------            CUT              ----------------------}

    *XX3402-000564-150897--72--85-59531----MWIDEEXP.DFM--1-OF--1
    zkc+J2NDIYol+1+E7+6++3FEFX+4J2NjQaol-INjQaol-2lZNbE1m++1J4xk+ak3JqZYR4U1
    Fk24G4JdNqVo+vA+-oBVQ5FdPqs42IFZPKwUPqMUJ2Z2FJBmNK3h12NjPbEiEqVVQbBZR+QD
    F2J4EJJAJ3x1G23GIoJI0YNjPbEiEqxgPr6514BgJqZiN4xrJ4JsR+h4Pqto9YVZOKRcR+9p
    0INjPbEiHa3hNEMBHJAUIq3iQm-HNL7dNUd4Pqto9ZBoSKlZ0k+BI4ZsNKlnI4JmGKtXO+7U
    0ZFZS5F6NKZbO5E01E+4J2lVMaJg-YlVMaJgAEFANKNo+W+1J4xk+VU3JqZYR4U03+N6NKZb
    O5E01ER1ML-oOKxi-UF4OKtY+++4J2lVMaJg-YlVMaJgAUFANKNo+W+1J4xk+Y+3JqZYR4U0
    8+N6NKZbO5E01ER1ML-oOKxi-URGNL-gMKBZ+++5J27pR5FjPUR0RLFoPqsl-2lZNbE0S+BI
    Pr+0M+JLOKFoO+79-YVZOKRcR+6N-oBVQ5FdPqs4-o7pR5FjPX26J43WHr7YNL60++RDPYBg
    OKBf-kl0RLFoPqslEqldMqg+++JIFKFdR+J3N4ZoAEFANKNo+Z+1J4xk+V+3JqZYR4U1kE+4
    G4JdNqVo+VI6J43WHr7YNL60+E++-JF3N4Zo-IJYOLEm-2lZNbE0I+BIPr+0C+JLOKFoO+D-
    ++N6NKZbO5E03EVIMK7DQaFZQU60++++
    ***** END OF BLOCK 1 *****

[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]