home *** CD-ROM | disk | FTP | other *** search
/ BUG 15 / BUGCD1998_06.ISO / desktop / hotkey / hotkey95.exe / Source / Components / BrowseEdit.pas < prev    next >
Pascal/Delphi Source File  |  1998-02-20  |  6KB  |  236 lines

  1. unit BrowseEdit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, Buttons;
  8.  
  9. type
  10.   TBrowseEdit = class;
  11.  
  12.   TBrowseButton = class(TSpeedButton)
  13.   private
  14.     FEdit : TBrowseEdit;
  15.   protected
  16.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  17.   public
  18.     constructor Create(AOwner: TComponent); override;
  19.     procedure Paint; override;
  20.  
  21.     procedure Click; override;
  22.   end;
  23.  
  24.   TBrowseEdit = class(TCustomEdit)
  25.   private
  26.     FButton: TBrowseButton;
  27.     FDialog: TOpenDialog;
  28.   protected
  29.     procedure cmEnabledChanged(var Msg: TMessage); message CM_ENABLEDCHANGED;
  30.     procedure wmChar(var Msg: TWMChar); message WM_CHAR;
  31.     procedure wmSize(var Msg: TWMSize); message WM_SIZE;
  32.     procedure wmSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
  33.     procedure ButtonClick;
  34.   public
  35.     constructor Create(AOwner: TComponent); override;
  36.     destructor Destroy; override;
  37.  
  38.     procedure CreateParams(var Params: TCreateParams); override;
  39.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  40.  
  41.     property Button: TBrowseButton read FButton;
  42.   published
  43.     property AutoSelect;
  44.     property AutoSize;
  45.     property CharCase;
  46.     property Color;
  47.     property Ctl3D;
  48.     property Dialog: TOpenDialog read FDialog write FDialog;
  49.     property DragCursor;
  50.     property DragMode;
  51.     property Enabled;
  52.     property Font;
  53.     property HideSelection;
  54.     property ImeMode;
  55.     property ImeName;
  56.     property MaxLength;
  57.     property OEMConvert;
  58.     property ParentColor;
  59.     property ParentCtl3D;
  60.     property ParentFont;
  61.     property ParentShowHint;
  62.     property PasswordChar;
  63.     property PopupMenu;
  64.     property ReadOnly;
  65.     property ShowHint;
  66.     property TabOrder;
  67.     property TabStop;
  68.     property Text;
  69.     property Visible;
  70.     property OnChange;
  71.     property OnClick;
  72.     property OnDblClick;
  73.     property OnDragDrop;
  74.     property OnDragOver;
  75.     property OnEndDrag;
  76.     property OnEnter;
  77.     property OnExit;
  78.     property OnKeyDown;
  79.     property OnKeyPress;
  80.     property OnKeyUp;
  81.     property OnMouseDown;
  82.     property OnMouseMove;
  83.     property OnMouseUp;
  84.     property OnStartDrag;
  85.   end;
  86.  
  87. procedure Register;
  88.  
  89. implementation
  90.  
  91. constructor TBrowseButton.Create(AOwner: TComponent);
  92. begin
  93.   inherited;
  94.   FEdit := TBrowseEdit(AOwner);
  95.   ControlStyle := ControlStyle - [csDoubleClicks];
  96. end;
  97.  
  98. procedure TBrowseButton.Paint;
  99. var
  100.   i,
  101.   XPos,
  102.   YPos   : Integer;
  103.   Color1,
  104.   Color2 : TColor;
  105. begin
  106.   XPos := 4;
  107.   YPos := Height-5;
  108.   with Canvas do
  109.    begin
  110.      Brush.Color := GetSysColor(COLOR_3DFACE);
  111.      if FState in [bsDown, bsExclusive] then
  112.       begin
  113.         Pen.Color := GetSysColor(COLOR_3DSHADOW);
  114.         Rectangle(0, 0, Width, Height);
  115.         inc(XPos); inc(YPos);
  116.       end
  117.      else
  118.       begin
  119.         FillRect(ClientRect);
  120.         Pen.Color := GetSysColor(COLOR_3DLIGHT);
  121.         PolyLine([Point(0, Height-1), Point(0, 0), Point(Width-1, 0)]);
  122.         Pen.Color := GetSysColor(COLOR_3DHILIGHT);
  123.         PolyLine([Point(1, Height-1), Point(1, 1), Point(Width-1, 1)]);
  124.         Pen.Color := GetSysColor(COLOR_3DDKSHADOW);
  125.         PolyLine([Point(0, Height-1), Point(Width-1, Height-1), Point(Width-1, -1)]);
  126.         Pen.Color := GetSysColor(COLOR_3DSHADOW);
  127.         PolyLine([Point(1, Height-2), Point(Width-2, Height-2), Point(Width-2, 0)]);
  128.       end;
  129.      Color2 := GetSysColor(COLOR_3DHIGHLIGHT);
  130.      if FEdit.Enabled then Color1 := GetSysColor(COLOR_BTNTEXT) else Color1 := GetSysColor(COLOR_3DSHADOW);
  131.      for i:=0 to 2 do
  132.       begin
  133.         Pixels[XPos+3*i, YPos] := Color1;
  134.         if not FEdit.Enabled then Pixels[XPos+3*i+1, YPos+1] := Color2;
  135.       end;
  136.    end;
  137. end;
  138.  
  139. procedure TBrowseButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  140. begin
  141.   inherited;
  142.   if FEdit.CanFocus then FEdit.SetFocus;
  143. end;
  144.  
  145. procedure TBrowseButton.Click;
  146. begin
  147.   inherited;
  148.   FEdit.ButtonClick;
  149. end;
  150.  
  151. { TBrowseEdit }
  152. constructor TBrowseEdit.Create(AOwner: TComponent);
  153. begin
  154.   inherited;
  155.   FButton := TBrowseButton.Create(Self);
  156.   with FButton do
  157.    begin
  158.      Parent := Self;
  159.      Cursor := crArrow;
  160.      Visible := True;
  161.    end;
  162. end;
  163.  
  164. destructor TBrowseEdit.Destroy;
  165. begin
  166.   FButton.Free;
  167.   inherited;
  168. end;
  169.  
  170. procedure TBrowseEdit.CreateParams(var Params: TCreateParams);
  171. begin
  172.   inherited CreateParams(Params);
  173.   with Params do Style := Style or ES_MULTILINE or ES_LEFT;
  174. end;
  175.  
  176. procedure TBrowseEdit.Notification(AComponent: TComponent; Operation: TOperation);
  177. begin
  178.   if (Operation=opRemove) and (AComponent=FDialog) then FDialog := nil;
  179.   inherited;
  180. end;
  181.  
  182. procedure TBrowseEdit.wmChar(var Msg: TWMChar);
  183. var
  184.   Key: Char;
  185. begin
  186.   if Msg.CharCode=VK_RETURN then
  187.    begin
  188.      MessageBeep(0);
  189.      Msg.CharCode := 0;
  190.      Key := #13;
  191.      KeyPress(Key);
  192.    end;
  193.   inherited;
  194. end;
  195.  
  196. procedure TBrowseEdit.wmSize(var Msg: TWMSize);
  197. var
  198.   Rect: TRect;
  199. begin
  200.   inherited;
  201.   Rect := ClientRect;
  202.   FButton.SetBounds(Rect.Right-16, 0, 16, Rect.Bottom);
  203.   Rect.right := Rect.right - 16;
  204.   Perform(EM_SETRECTNP, 0, lParam(@Rect));
  205. end;
  206.  
  207. procedure TBrowseEdit.wmSetFocus(var Msg: TWMSetFocus);
  208. begin
  209.   inherited;
  210.   CreateCaret(Handle, 0, 1, ClientHeight-4);
  211.   ShowCaret(Handle);
  212. end;
  213.  
  214. procedure TBrowseEdit.cmEnabledChanged(var Msg: TMessage);
  215. begin
  216.   FButton.Paint;
  217. end;
  218.  
  219. procedure TBrowseEdit.ButtonClick;
  220. begin
  221.   if Assigned(FDialog) then
  222.    with FDialog do
  223.     if Execute then
  224.      begin
  225.        Text := FileName;
  226.        if AutoSelect then Perform(EM_SETSEL, 0, Length(Text));
  227.      end;
  228. end;
  229.  
  230. procedure Register;
  231. begin
  232.   RegisterComponents('SheAr', [TBrowseEdit]);
  233. end;
  234.  
  235. end.
  236.