WIZARDXPGEN.PAS
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:7k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit wizardXPGen;
  2. interface
  3. uses 
  4.   toolsAPI,
  5.   IStreams,
  6.   dialogs,
  7.   SysUtils,
  8.   Windows,
  9.   VirtIntf,
  10.   ExptIntf,
  11.   ToolIntf,
  12.   classes;
  13. type
  14.      
  15.   // TNotifierObject has stub implementations for the necessary but
  16.   // unused IOTANotifer methods
  17.   TXPGenWizard = class(TNotifierObject, IOTANotifier,IOTAKeyboardBinding)
  18.   public
  19.     // IOTAWizard interafce methods(required for all wizards/experts)
  20.     function GetIDString: string;
  21.     function GetName: string;
  22.     function GetState: TWizardState;
  23.     procedure Execute;
  24.     procedure KeyBoardHandler(const Context: IOTAKeyContext; KeyCode: TShortcut;
  25.     var BindingResult: TKeyBindingResult);
  26.     // IOTAMenuWizard (creates a simple menu item on the help menu)
  27.     function GetMenuText: string;
  28.     procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
  29.     function GetBindingType: TBindingType;
  30.     function GetDisplayName: string;    
  31.     private
  32.     function GenerateTestCode(srcStream : TMemorystream) : string;  
  33.     function FindSourceEditor(sourceModule: IOTAModule): IOTASourceEditor;
  34.     function GetSourceModuleLength(SrceEditor: IOTASourceEditor): longint;
  35.     function SrcModuleToMemoryStream(srcModule: IOTAModule): TMemoryStream;
  36.     
  37.   end;
  38. procedure Register;
  39. implementation
  40. uses
  41.   menus,
  42.   xpParse,
  43.   xpCodeGen;
  44.   
  45. procedure Register;
  46. begin
  47. (BorlandIDEServices as IOTAKeyBoardServices).AddKeyboardBinding(TXPGenWizard.Create);
  48. end;
  49. procedure TXPGenWizard.BindKeyboard(
  50.   const BindingServices: IOTAKeyBindingServices);
  51. begin
  52.   BindingServices.AddKeyBinding([ShortCut(Ord('X'), [ssShift, ssCtrl])], KeyboardHandler, nil,
  53.     kfImplicitShift or kfImplicitModifier or kfImplicitKeypad, '', '');  
  54. end;
  55. procedure TXPGenWizard.Execute;
  56. var
  57.   ModulePath,
  58.   ModuleName,
  59.   UnitName, FileName, FormName: string;
  60.   SourceStream: TIMemoryStream;
  61.   SourceBufferStream : TMemoryStream;
  62.   SourceEditor: IOTASourceEditor;
  63.   moduleInfo: IOTAModuleInfo;
  64.   Writer: IOTAEditWriter;
  65.   currentModule,
  66.     sourceModule: IOTAModule;
  67.   moduleServices: IOTAModuleServices;
  68.   sourceText: string;
  69.   mlength: longint;
  70.   
  71. begin
  72.   if (toolServices <> nil) then
  73.     begin
  74.       if BorlandIDEServices.QueryInterface(IOTAModuleServices, ModuleServices) =
  75.         S_OK then
  76.         begin
  77.           CurrentModule := ModuleServices.CurrentModule;
  78.           if currentModule <> nil then
  79.             begin
  80.               ModulePath := currentModule.Filename;
  81.               if ExtractFileExt(lowercase(ModulePath)) = '.pas' then
  82.                 begin
  83.                   ModulePath := ExtractFilePath(modulePath);
  84.                   Modulename := currentModule.Filename;
  85.                   Modulename := ExtractFilename(modulename);
  86.                   { ensure this is always a new pass file in case they do this on a DFM file }
  87.                   ModuleName := ChangeFileExt(moduleName, '.pas');
  88.                   ModuleName := 'Test_' + ModuleName;
  89.                   { copy the module source code to a memory stream we can deal with }
  90.                   SourceBufferStream := SrcModuleToMemoryStream(CurrentModule);
  91.                   if sourcebufferSTream <> nil then
  92.                     begin
  93.                        sourceText := GenerateTestCode(SourceBufferStream);
  94.                SourceStream := TIMemoryStream.Create(TMemoryStream.Create,soOwned);
  95.                ToolServices.CreateModule(ModulePath+ModuleName,SourceStream,nil,[cmNewUnit]); 
  96.              { get the tool that keeps track of all project modules }
  97.              { you can do a cast here with (BorlandIDEServes as x) but why chance it? }
  98.                SourceModule := ModuleServices.FindModule(ModulePath+ModuleName);
  99.                if SourceModule <> nil then
  100.                  begin
  101.                    SourceEditor := FindSourceEditor(sourceModule);
  102.                    if sourceEditor <> nil then
  103.                      begin
  104.                        mlength := GetSourceModuleLength(SourceEditor);
  105.                        Writer := SourceEditor.CreateWriter;
  106.                        Writer.DeleteTo(mlength);
  107.                        Writer.Insert(pchar(sourceText));
  108.                      end;
  109.                  end;                       
  110.                        sourceBufferStream.Free;
  111.                     end;   
  112.                 end
  113.               else
  114.                 MessageBeep(word(-1));  
  115.             end;
  116.           {     filename := currentModule.Filename;
  117.                filename := ChangeFileExt(filename,'.pas');}
  118.         end;
  119.     end;
  120. end;
  121. function TXPGenWizard.GetBindingType: TBindingType;
  122. begin
  123.   result := btPartial;
  124. end;
  125. function TXPGenWizard.GetDisplayName: string;
  126. begin
  127.   result := 'hello wizard';
  128. end;
  129. function TXPGenWizard.GetIDString: string;
  130. begin
  131.   Result := 'EB.HelloWizard';
  132. end;
  133. function TXPGenWizard.GetMenuText: string;
  134. begin
  135.   Result := '&Hello Wizard';
  136. end;
  137. function TXPGenWizard.GetName: string;
  138. begin
  139.   Result := 'Hello Wizard';
  140. end;
  141. function TXPGenWizard.GetState: TWizardState;
  142. begin
  143.   Result := [wsEnabled];
  144. end;
  145. procedure TXPGenWizard.KeyBoardHandler(const Context: IOTAKeyContext;
  146.   KeyCode: TShortcut; var BindingResult: TKeyBindingResult);
  147. begin
  148.   Execute;
  149.   BindingResult := krHandled;
  150. end;
  151. function TXPGenWizard.GenerateTestCode(srcStream : TMemorystream) : string;
  152. var
  153.   XPParser : TXPStubParser;
  154.   SrcGen : SrcGenExternalTest;
  155.   SrcCodeDriver : DriverSrcOutputText;
  156. begin
  157.   result := '';
  158.   try
  159.     XPParser := nil;
  160.     try
  161.       XPParser := TXPStubParser.Create;    
  162.       XPParser.SrcStream := srcStream;
  163.       srcStream.Position := 0;
  164.       XPParser.Parse;
  165.       SrcCodeDriver := DriverSrcOutputText.Create;
  166.       try
  167.       SrcGen := SrcGenExternalTest.Create(XPParser.unitName,SrcCodeDriver);
  168.       try
  169.         SrcGen.GenerateCode(XPParser.ParseNodeList);
  170.         result := srcCodeDriver.text;
  171.       finally
  172.         SrcGen.Free;
  173.       end;
  174.       finally
  175.         SrcCodeDriver.Free;
  176.       end;
  177.     finally
  178.       XPParser.Free;
  179.     end;
  180.   finally
  181.   end;
  182. end;
  183. function TXPGenWizard.FindSourceEditor(sourceModule: IOTAModule): IOTASourceEditor;
  184. var
  185.   i: integer;
  186. begin
  187.   i := 0;
  188.   with sourceModule do
  189.     begin
  190.       while (i < GetModuleFileCount) do
  191.         if GetModuleFileEditor(i).QueryInterface(IOTASourceEditor, result) =
  192.           S_OK then
  193.           break
  194.         else
  195.           inc(i);
  196.     end;
  197. end;  
  198. function TXPGenWizard.GetSourceModuleLength(SrceEditor: IOTASourceEditor): longint;
  199. var
  200.   Reader: IOTAEditReader;
  201.   buf: char;
  202. begin
  203.   result := 0;
  204.   reader := SrceEditor.CreateReader;
  205.   while reader.getText(result, @buf, 1) > 0 do
  206.     begin
  207.       inc(result);
  208.     end;
  209.   reader := nil;
  210. end;
  211. function TXPGenWizard.SrcModuleToMemoryStream(srcModule : IOTAModule) : TMemoryStream;
  212. var
  213.   moduleSize : longint;
  214.   SourceEditor: IOTASourceEditor;    
  215.   Rdr: IOTAEditReader;
  216.   pos: longint;
  217.   buf: char; 
  218.   res : integer;   
  219. begin
  220.   result := TMemoryStream.create;
  221.   SourceEditor := FindSourceEditor(srcModule);
  222.   if sourceEditor <> nil then
  223.     begin
  224.       ModuleSize := GetSourceModuleLength(SourceEditor);    
  225.       result.setSize(ModuleSize);
  226.       { transfere the data from the source module to the memory stream }
  227.       sourceEditor := nil;
  228.       SourceEditor := FindSourceEditor(srcModule);        
  229.       rdr := SourceEditor.CreateReader;
  230.       pos := 0;
  231.       while rdr.getText(pos, @buf, 1) > 0 do
  232.         begin
  233.           result.write(buf,sizeof(buf));
  234.           inc(pos);
  235.         end;      
  236.     end;  
  237. end;
  238. end.