home *** CD-ROM | disk | FTP | other *** search
/ Delphi 5 for Professionals / DELPHI5.iso / AddOns / Components / TEECHART / Delphi1_And_Delphi2 / EXAMPLES / OTHER / NETSCAPE / NPFORM.PAS next >
Encoding:
Pascal/Delphi Source File  |  1998-10-24  |  4.5 KB  |  168 lines

  1. { Netscape plugin form and plugin class }
  2.  
  3. unit NPForm;
  4.  
  5. interface
  6.  
  7. uses
  8.   Messages, Windows, Classes, Controls, NPPlugin, NPSubCls,Forms ;
  9.  
  10. { TPluginForm - base class for forms that can be put into plugins }
  11.  
  12. type
  13.   TFormPlugin = class ; { forward declaration }
  14.  
  15.   TPluginForm = class( TForm )
  16.   private
  17.     FPlugin    : TFormPlugin ;
  18.   protected
  19.     procedure Loaded ; override ;
  20.     procedure SetPluginDefaults ; virtual ;
  21.     procedure CreateParams( var Params : TCreateParams ) ; override ;
  22.   public
  23.     { ignore compiler warning for next line -
  24.       the redeclaration of Create is intentional }
  25.     constructor Create( AOwner  : TComponent ;
  26.                         APlugin : TFormPlugin ) ; virtual ;
  27.     property Plugin : TFormPlugin read FPlugin ;
  28.   end ;
  29.  
  30.   TPluginFormClass = class of TPluginForm ;
  31.  
  32.   TFormPlugin = class( TSubclassedPlugin )
  33.   private
  34.     FPluginForm : TPluginForm ;
  35.   protected
  36.     procedure ResizePluginForm ; virtual ;
  37.     function  CreatePluginForm : TPluginForm ; virtual ;
  38.     procedure WindowHandleChanged ; override ;
  39.     procedure WindowChanged ; override ;
  40.     procedure WndProc( var Message : TMessage ) ; override ;
  41.   public
  42.     property PluginForm : TPluginForm read FPluginForm ;
  43.   end ;
  44.  
  45.   TPluginFormInfo = class
  46.   private
  47.     FFormClass : TPluginFormClass ;
  48.   public
  49.     constructor Create( AFormClass : TPluginFormClass ) ;
  50.     property FormClass : TPluginFormClass read FFormClass ;
  51.   end ;
  52.  
  53. procedure RegisterPluginForm( const MimeTypes : string ;
  54.                               FormClass       : TPluginFormClass ) ;
  55.  
  56. implementation
  57.  
  58. { TPluginForm }
  59.  
  60. constructor TPluginForm.Create( AOwner  : TComponent ;
  61.                                 APlugin : TFormPlugin) ;
  62. begin
  63.   FPlugin := APlugin ;
  64.   inherited Create( AOwner ) ;
  65.   SetPluginDefaults ;
  66. end ;
  67.  
  68. procedure TPluginForm.Loaded ;
  69. begin
  70.   inherited Loaded ;
  71.   SetPluginDefaults ;
  72. end ;
  73.  
  74. procedure TPluginForm.SetPluginDefaults ;
  75. begin
  76.   BorderStyle := bsNone ;
  77. end ;
  78.  
  79. procedure TPluginForm.CreateParams( var Params : TCreateParams ) ;
  80. begin
  81.   inherited CreateParams( Params ) ;
  82.  
  83.   { set window parent and special plugin form create params }
  84.   if Plugin.WindowHandle <> 0 then with Params do begin
  85.     WndParent := Plugin.WindowHandle ;
  86.     Style := WS_CHILD or WS_CLIPCHILDREN or WS_CLIPSIBLINGS ;
  87.     X := 0 ;
  88.     Y := 0 ;
  89.   end ;
  90. end ;
  91.  
  92. { TFormPlugin }
  93.  
  94. procedure TFormPlugin.ResizePluginForm ;
  95. var ARect : TRect ;
  96. begin
  97.   Windows.GetClientRect( WindowHandle, ARect ) ;
  98.   PluginForm.SetBounds( 0, 0, ARect.Right, ARect.Bottom ) ;
  99. end ;
  100.  
  101. function  TFormPlugin.CreatePluginForm : TPluginForm ;
  102. begin
  103.   Result := ( ExtraInfo as TPluginFormInfo ).FormClass.Create( Application, Self )
  104.             as TPluginForm ;
  105. end ;
  106.  
  107. procedure TFormPlugin.WindowHandleChanged ;
  108. begin
  109.   inherited WindowHandleChanged ;
  110.   if WindowHandle = 0 then exit ;
  111.  
  112.   { set the clip children flag in the plugin window style so that }
  113.   { the background isn't erased where the form is going to be.    }
  114.   SetWindowLong( WindowHandle, GWL_STYLE,
  115.                  GetWindowLong( WindowHandle, GWL_STYLE ) or WS_CLIPCHILDREN ) ;
  116.  
  117.   { we have a new window handle - create a form and resize it to fit }
  118.   FPluginForm := CreatePluginForm ;
  119.   try
  120.     ResizePluginForm ;
  121.     FPluginForm.Show ;
  122.   except
  123.     FPluginForm.Free ;
  124.     FPluginForm := NIL ;
  125.   end ;
  126. end ;
  127.  
  128. procedure TFormPlugin.WindowChanged ;
  129. begin
  130.   inherited WindowChanged ;
  131.  
  132.   { make sure the plugin form fills up the plugin area }
  133.   if PluginForm <> NIL then ResizePluginForm ;
  134. end ;
  135.  
  136. procedure TFormPlugin.WndProc( var Message : TMessage ) ;
  137. begin
  138.   { don't erase the background }
  139.   with Message do if Msg = WM_ERASEBKGND then
  140.     Result := 0 else inherited WndProc( Message ) ;
  141. end ;
  142.  
  143. { TPluginFormInfo }
  144.  
  145. constructor TPluginFormInfo.Create( AFormClass : TPluginFormClass ) ;
  146. begin
  147.   inherited Create ;
  148.   FFormClass := AFormClass ;
  149. end ;
  150.  
  151. procedure RegisterFormPlugin( PluginClass     : TPluginClass ;
  152.                               const MimeTypes : string ;
  153.                               FormClass       : TPluginFormClass ) ;
  154. begin
  155.   PluginClass.Register( MimeTypes, TPluginFormInfo.Create( FormClass ) ) ;
  156. end ;
  157.  
  158. { RegisterPluginForm
  159.   Utility routine - could just as easily call Register method directly. }
  160.  
  161. procedure RegisterPluginForm( const MimeTypes : string ;
  162.                               FormClass       : TPluginFormClass ) ;
  163. begin
  164.   RegisterFormPlugin( TFormPlugin, MimeTypes, FormClass ) ;
  165. end ;
  166.  
  167. end.
  168.