RVPopup.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:10k
源码类别:

RichEdit

开发平台:

Delphi

  1. unit RVPopup;
  2. interface
  3. {$I RV_Defs.inc}
  4. {$IFNDEF RVDONOTUSESMARTPOPUP}
  5. uses Windows, Messages, Classes, Graphics, Controls, Menus,
  6.   {$IFDEF RICHVIEWDEF4}
  7.   ImgList,
  8.   {$ENDIF}
  9.   RVScroll, RVItem, CRVData;
  10. type
  11.   TRVSmartPopupButton = class;
  12.   TRVSmartPopupProperties = class (TPersistent)
  13.   private
  14.     FImageIndex: Integer;
  15.     FImageList: TCustomImageList;
  16.     FColor: TColor;
  17.     FHoverLineColor: TColor;
  18.     FLineColor: TColor;
  19.     FHoverColor: TColor;
  20.     FMenu: TPopupMenu;
  21.     FHint: String;
  22.     FShortCut: TShortCut;
  23.     FButtonType: TRVSmartPopupType;
  24.     FButton: TRVSmartPopupButton;
  25.     procedure SetImageIndex(const Value: Integer);
  26.     procedure SetImageList(const Value: TCustomImageList);
  27.     procedure SetColor(const Value: TColor);
  28.     procedure SetHoverColor(const Value: TColor);
  29.     procedure SetHoverLineColor(const Value: TColor);
  30.     procedure SetLineColor(const Value: TColor);
  31.     procedure SetHint(const Value: String);
  32.     function StoreHint: Boolean;
  33.   public
  34.     RichView: TRVScroller;
  35.     constructor Create;
  36.     procedure Assign(Source: TPersistent); override;
  37.     procedure SetButtonState(Hot: Boolean);
  38.   published
  39.     property ImageIndex: Integer read FImageIndex write SetImageIndex default 0;
  40.     property ImageList: TCustomImageList read FImageList write SetImageList;
  41.     property Color: TColor read FColor write SetColor default clWindow;
  42.     property HoverColor: TColor read FHoverColor write SetHoverColor default clInfoBk;
  43.     property LineColor: TColor read FLineColor write SetLineColor default clHighlight;
  44.     property HoverLineColor: TColor read FHoverLineColor write SetHoverLineColor default clInfoText;
  45.     property Menu: TPopupMenu read FMenu write FMenu;
  46.     property Hint: String read FHint write SetHint stored StoreHint;
  47.     property ShortCut: TShortCut read FShortCut write FShortCut default $6028;
  48.     property ButtonType: TRVSmartPopupType read FButtonType write FButtonType default rvsptDropDown;
  49.   end;
  50.   TRVSmartPopupButton = class (TCustomControl)
  51.   private
  52.     FHot, FAlwaysHot: Boolean;
  53.     FSmartPopupProperties: TRVSmartPopupProperties;
  54.     procedure SetSmartPopupProperties(
  55.       const Value: TRVSmartPopupProperties);
  56.     procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
  57.     procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  58.   protected
  59.     procedure Paint; override;
  60.   public
  61.     Item: TCustomRVItemInfo;
  62.     RVData: TCustomRVData;
  63.     ItemNo: Integer;
  64.     destructor Destroy; override;
  65.     procedure Click; override;
  66.     property SmartPopupProperties: TRVSmartPopupProperties
  67.       read FSmartPopupProperties write SetSmartPopupProperties;
  68.   end;
  69. {$ENDIF}
  70. implementation
  71. uses RVRVData, RichView;
  72. {$IFNDEF RVDONOTUSESMARTPOPUP}
  73. {================================= TRVSmartPopup ==============================}
  74. constructor TRVSmartPopupProperties.Create;
  75. begin
  76.   inherited Create;
  77.   FColor          := clWindow;
  78.   FHoverColor     := clInfoBk;
  79.   FLineColor      := clHighlight;
  80.   FHoverLineColor := clInfoText;
  81.   FShortCut       := $6028; // Ctrl+Shift+Down;
  82.   FButtonType     := rvsptDropDown;
  83. end;
  84. {------------------------------------------------------------------------------}
  85. procedure TRVSmartPopupProperties.Assign(Source: TPersistent);
  86. begin
  87.   if Source is TRVSmartPopupProperties then begin
  88.     FImageList      := TRVSmartPopupProperties(Source).ImageList;
  89.     FImageIndex     := TRVSmartPopupProperties(Source).ImageIndex;  
  90.     FColor          := TRVSmartPopupProperties(Source).Color;
  91.     FHoverColor     := TRVSmartPopupProperties(Source).HoverColor;
  92.     FLineColor      := TRVSmartPopupProperties(Source).LineColor;
  93.     FHoverLineColor := TRVSmartPopupProperties(Source).HoverLineColor;
  94.     FShortCut       := TRVSmartPopupProperties(Source).ShortCut;
  95.     FButtonType     := TRVSmartPopupProperties(Source).ButtonType;
  96.     FHint           := TRVSmartPopupProperties(Source).Hint;
  97.     FMenu           := TRVSmartPopupProperties(Source).Menu;
  98.     end
  99.   else
  100.     inherited Assign(Source);
  101. end;
  102. {------------------------------------------------------------------------------}
  103. procedure TRVSmartPopupProperties.SetColor(const Value: TColor);
  104. begin
  105.   FColor := Value;
  106.   if FButton<>nil then
  107.     FButton.Invalidate;
  108. end;
  109. {------------------------------------------------------------------------------}
  110. procedure TRVSmartPopupProperties.SetHint(const Value: String);
  111. begin
  112.   FHint := Value;
  113.   if FButton<>nil then
  114.     FButton.Hint := FHint;
  115. end;
  116. {------------------------------------------------------------------------------}
  117. procedure TRVSmartPopupProperties.SetHoverColor(const Value: TColor);
  118. begin
  119.   FHoverColor := Value;
  120.   if FButton<>nil then
  121.     FButton.Invalidate;
  122. end;
  123. {------------------------------------------------------------------------------}
  124. procedure TRVSmartPopupProperties.SetHoverLineColor(const Value: TColor);
  125. begin
  126.   FHoverLineColor := Value;
  127.   if FButton<>nil then
  128.     FButton.Invalidate;
  129. end;
  130. {------------------------------------------------------------------------------}
  131. procedure TRVSmartPopupProperties.SetImageIndex(const Value: Integer);
  132. begin
  133.   FImageIndex := Value;
  134.   if FButton<>nil then
  135.     FButton.Invalidate;
  136. end;
  137. {------------------------------------------------------------------------------}
  138. procedure TRVSmartPopupProperties.SetImageList(const Value: TCustomImageList);
  139. begin
  140.   FImageList := Value;
  141.   if FButton<>nil then
  142.     FButton.Invalidate;
  143. end;
  144. {------------------------------------------------------------------------------}
  145. procedure TRVSmartPopupProperties.SetLineColor(const Value: TColor);
  146. begin
  147.   FLineColor := Value;
  148.   if FButton<>nil then
  149.     FButton.Invalidate;
  150. end;
  151. {------------------------------------------------------------------------------}
  152. function TRVSmartPopupProperties.StoreHint: Boolean;
  153. begin
  154.   Result := Hint<>'';
  155. end;
  156. {------------------------------------------------------------------------------}
  157. procedure TRVSmartPopupProperties.SetButtonState(Hot: Boolean);
  158. begin
  159.   if FButton=nil then
  160.     exit;
  161.   FButton.FAlwaysHot := Hot;
  162.   if Hot then
  163.     SendMessage(FButton.Handle, CM_MOUSEENTER, 0, 0)
  164.   else
  165.     SendMessage(FButton.Handle, CM_MOUSELEAVE, 0, 0);  
  166. end;
  167. {============================= TRVSmartPopupButton ============================}
  168. procedure TRVSmartPopupButton.CMMouseEnter(var Msg: TMessage);
  169. begin
  170.   if not FHot and (FSmartPopupProperties.ButtonType<>rvsptSimple) then
  171.     Width := Width+10;
  172.   FHot := True;
  173.   Invalidate;
  174. end;
  175. {------------------------------------------------------------------------------}
  176. procedure TRVSmartPopupButton.CMMouseLeave(var Msg: TMessage);
  177. begin
  178.   if FAlwaysHot then
  179.     exit;
  180.   if FHot and (FSmartPopupProperties.ButtonType<>rvsptSimple) then
  181.     Width := Width-10;
  182.   FHot := False;
  183.   Invalidate;
  184. end;
  185. {------------------------------------------------------------------------------}
  186. procedure TRVSmartPopupButton.Paint;
  187. var PointArray: array[0..2] of TPoint;
  188.     Y: Integer;
  189. begin
  190.   if FHot then begin
  191.     Canvas.Pen.Color   := FSmartPopupProperties.HoverLineColor;
  192.     Canvas.Brush.Color := FSmartPopupProperties.HoverColor;
  193.     end
  194.   else begin
  195.     Canvas.Pen.Color   := FSmartPopupProperties.LineColor;
  196.     Canvas.Brush.Color := FSmartPopupProperties.Color;
  197.   end;
  198.   Canvas.Rectangle(0,0,Width,Height);
  199.   if (FSmartPopupProperties.ImageList<>nil) and
  200.      (FSmartPopupProperties.ImageIndex>=0) and
  201.      (FSmartPopupProperties.ImageIndex<FSmartPopupProperties.ImageList.Count) then
  202.     FSmartPopupProperties.ImageList.Draw(Canvas, 2, 2, FSmartPopupProperties.ImageIndex);
  203.   if FHot then
  204.     case FSmartPopupProperties.ButtonType of
  205.       rvsptDropDown:
  206.         begin
  207.           Canvas.Brush.Color := Canvas.Pen.Color;
  208.           PointArray[0].X := Width-10;
  209.           PointArray[1].X := Width-4;
  210.           PointArray[2].X := Width-7;
  211.           PointArray[0].Y := Height div 2 - 2;
  212.           PointArray[1].Y := PointArray[0].Y;
  213.           PointArray[2].Y := PointArray[0].Y+3;
  214.           Canvas.Polygon(PointArray);
  215.         end;
  216.      rvsptShowDialog:
  217.        begin
  218.          Canvas.Brush.Color := Canvas.Pen.Color;
  219.          Y := Height div 2+2;
  220.          Canvas.MoveTo(Width-10, Y-1);
  221.          Canvas.LineTo(Width-10, Y+1);
  222.          Canvas.MoveTo(Width-7, Y-1);
  223.          Canvas.LineTo(Width-7, Y+1);
  224.          Canvas.MoveTo(Width-4, Y-1);
  225.          Canvas.LineTo(Width-4, Y+1);
  226.        end;
  227.   end;
  228. end;
  229. {------------------------------------------------------------------------------}
  230. procedure TRVSmartPopupButton.SetSmartPopupProperties(
  231.   const Value: TRVSmartPopupProperties);
  232. begin
  233.   FSmartPopupProperties := Value;
  234.   FSmartPopupProperties.FButton := Self;
  235.   ShowHint := True;
  236.   Hint := FSmartPopupProperties.Hint;
  237.   if Value.ImageList<>nil then begin
  238.     Width  := TImageList(Value.ImageList).Width+4;
  239.     Height := TImageList(Value.ImageList).Height+4;
  240.     end
  241.   else begin
  242.     Width := 20;
  243.     Height := 20;
  244.   end;
  245. end;
  246. {------------------------------------------------------------------------------}
  247. procedure TRVSmartPopupButton.Click;
  248. var pt: TPoint;
  249.     rv: TCustomRichView;
  250. begin
  251.   rv := TCustomRichView(TRichViewRVData(RVData.GetAbsoluteRootData).RichView);
  252.   if Assigned(rv.OnSmartPopupClick) then
  253.     rv.OnSmartPopupClick(rv, Self);
  254.   if FSmartPopupProperties.Menu<>nil then begin
  255.     pt := Point(0, Height);
  256.     pt := ClientToScreen(pt);
  257.     FSmartPopupProperties.SetButtonState(True);
  258.     try
  259.       FSmartPopupProperties.Menu.Popup(pt.X, pt.Y);
  260.     finally
  261.       FSmartPopupProperties.SetButtonState(False);
  262.     end;
  263.   end;
  264. end;
  265. {------------------------------------------------------------------------------}
  266. destructor TRVSmartPopupButton.Destroy;
  267. begin
  268.   FSmartPopupProperties.FButton := nil;
  269.   inherited;
  270. end;
  271. {$ENDIF}
  272. end.