home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 February / PCWorld_1999-02_cd.bin / temacd / HotKeys / BrowseEdit.pas < prev    next >
Pascal/Delphi Source File  |  1998-08-13  |  7KB  |  265 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.     FOnButtonClick: TNotifyEvent;
  29.   protected
  30.     procedure cmEnabledChanged(var Msg: TMessage); message CM_ENABLEDCHANGED;
  31.     procedure wmChar(var Msg: TWMChar); message WM_CHAR;
  32.     procedure wmSize(var Msg: TWMSize); message WM_SIZE;
  33.     procedure wmSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
  34.     procedure ButtonClick;
  35.     procedure SetEditRect;
  36.   public
  37.     constructor Create(AOwner: TComponent); override;
  38.     destructor Destroy; override;
  39.     procedure CreateWnd; override;
  40.  
  41.     procedure CreateParams(var Params: TCreateParams); override;
  42.     procedure WndProc(var Message: TMessage); override;
  43.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  44.  
  45.     property Button: TBrowseButton read FButton;
  46.   published
  47.     property AutoSelect;
  48.     property AutoSize;
  49.     property CharCase;
  50.     property Color;
  51.     property Ctl3D;
  52.     property Dialog: TOpenDialog read FDialog write FDialog;
  53.     property DragCursor;
  54.     property DragMode;
  55.     property Enabled;
  56.     property Font;
  57.     property HideSelection;
  58.     property ImeMode;
  59.     property ImeName;
  60.     property MaxLength;
  61.     property OEMConvert;
  62.     property ParentColor;
  63.     property ParentCtl3D;
  64.     property ParentFont;
  65.     property ParentShowHint;
  66.     property PasswordChar;
  67.     property PopupMenu;
  68.     property ReadOnly;
  69.     property ShowHint;
  70.     property TabOrder;
  71.     property TabStop;
  72.     property Text;
  73.     property Visible;
  74.     property OnButtonClick: TNotifyEvent read FOnButtonClick write FOnButtonClick;
  75.     property OnChange;
  76.     property OnClick;
  77.     property OnDblClick;
  78.     property OnDragDrop;
  79.     property OnDragOver;
  80.     property OnEndDrag;
  81.     property OnEnter;
  82.     property OnExit;
  83.     property OnKeyDown;
  84.     property OnKeyPress;
  85.     property OnKeyUp;
  86.     property OnMouseDown;
  87.     property OnMouseMove;
  88.     property OnMouseUp;
  89.     property OnStartDrag;
  90.   end;
  91.  
  92. procedure Register;
  93.  
  94. implementation
  95.  
  96. constructor TBrowseButton.Create(AOwner: TComponent);
  97. begin
  98.   inherited;
  99.   FEdit := TBrowseEdit(AOwner);
  100.   ControlStyle := ControlStyle - [csDoubleClicks];
  101. end;
  102.  
  103. procedure TBrowseButton.Paint;
  104. var
  105.   i,
  106.   XPos,
  107.   YPos   : Integer;
  108.   Color1,
  109.   Color2 : TColor;
  110. begin
  111.   XPos := 4;
  112.   YPos := Height-5;
  113.   with Canvas do
  114.    begin
  115.      Brush.Color := GetSysColor(COLOR_3DFACE);
  116.      if FState in [bsDown, bsExclusive] then
  117.       begin
  118.         Pen.Color := GetSysColor(COLOR_3DSHADOW);
  119.         Rectangle(0, 0, Width, Height);
  120.         inc(XPos); inc(YPos);
  121.       end
  122.      else
  123.       begin
  124.         FillRect(ClientRect);
  125.         Pen.Color := GetSysColor(COLOR_3DLIGHT);
  126.         PolyLine([Point(0, Height-1), Point(0, 0), Point(Width-1, 0)]);
  127.         Pen.Color := GetSysColor(COLOR_3DHILIGHT);
  128.         PolyLine([Point(1, Height-1), Point(1, 1), Point(Width-1, 1)]);
  129.         Pen.Color := GetSysColor(COLOR_3DDKSHADOW);
  130.         PolyLine([Point(0, Height-1), Point(Width-1, Height-1), Point(Width-1, -1)]);
  131.         Pen.Color := GetSysColor(COLOR_3DSHADOW);
  132.         PolyLine([Point(1, Height-2), Point(Width-2, Height-2), Point(Width-2, 0)]);
  133.       end;
  134.      Color2 := GetSysColor(COLOR_3DHIGHLIGHT);
  135.      if FEdit.Enabled then Color1 := GetSysColor(COLOR_BTNTEXT) else Color1 := GetSysColor(COLOR_3DSHADOW);
  136.      for i:=0 to 2 do
  137.       begin
  138.         Pixels[XPos+3*i, YPos] := Color1;
  139.         if not FEdit.Enabled then Pixels[XPos+3*i+1, YPos+1] := Color2;
  140.       end;
  141.    end;
  142. end;
  143.  
  144. procedure TBrowseButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  145. begin
  146.   inherited;
  147.   if FEdit.CanFocus then FEdit.SetFocus;
  148. end;
  149.  
  150. procedure TBrowseButton.Click;
  151. begin
  152.   inherited;
  153.   FEdit.ButtonClick;
  154. end;
  155.  
  156. { TBrowseEdit }
  157. constructor TBrowseEdit.Create(AOwner: TComponent);
  158. begin
  159.   inherited;
  160.   FButton := TBrowseButton.Create(Self);
  161.   with FButton do
  162.    begin
  163.      Parent := Self;
  164.      Cursor := crArrow;
  165.      Visible := True;
  166.    end;
  167. end;
  168.  
  169. destructor TBrowseEdit.Destroy;
  170. begin
  171.   FButton.Free;
  172.   inherited;
  173. end;
  174.  
  175. procedure TBrowseEdit.CreateParams(var Params: TCreateParams);
  176. begin
  177.   inherited CreateParams(Params);
  178.   with Params do Style := Style or ES_MULTILINE or ES_LEFT;
  179. end;
  180.  
  181. procedure TBrowseEdit.Notification(AComponent: TComponent; Operation: TOperation);
  182. begin
  183.   if (Operation=opRemove) and (AComponent=FDialog) then FDialog := nil;
  184.   inherited;
  185. end;
  186.  
  187. procedure TBrowseEdit.wmChar(var Msg: TWMChar);
  188. var
  189.   Key: Char;
  190. begin
  191.   if Msg.CharCode=VK_RETURN then
  192.    begin
  193.      MessageBeep(0);
  194.      Msg.CharCode := 0;
  195.      Key := #13;
  196.      KeyPress(Key);
  197.    end;
  198.   inherited;
  199. end;
  200.  
  201. procedure TBrowseEdit.CreateWnd;
  202. begin
  203.   inherited;
  204.   SetEditRect;
  205. end;
  206.  
  207. procedure TBrowseEdit.SetEditRect;
  208. var
  209.   Rect: TRect;
  210. begin
  211.   Rect := ClientRect;
  212.   FButton.SetBounds(Rect.Right-16, 0, 16, Rect.Bottom);
  213.   Rect.right := Rect.right - 16;
  214.   Perform(EM_SETRECTNP, 0, lParam(@Rect));
  215. end;
  216.  
  217. procedure TBrowseEdit.wmSize(var Msg: TWMSize);
  218. begin
  219.   inherited;
  220.   SetEditRect;
  221. end;
  222.  
  223. procedure TBrowseEdit.WndProc(var Message: TMessage);
  224. begin
  225.   with Message do
  226.     case Msg of
  227.       WM_WINDOWPOSCHANGING: SetEditRect;
  228.     end;
  229.   inherited WndProc(Message);
  230. end; { WndProc }
  231.  
  232. procedure TBrowseEdit.wmSetFocus(var Msg: TWMSetFocus);
  233. begin
  234.   inherited;
  235.   CreateCaret(Handle, 0, 1, ClientHeight-4);
  236.   ShowCaret(Handle);
  237. end;
  238.  
  239. procedure TBrowseEdit.cmEnabledChanged(var Msg: TMessage);
  240. begin
  241.   FButton.Paint;
  242. end;
  243.  
  244. procedure TBrowseEdit.ButtonClick;
  245. begin
  246.   if Assigned(FDialog) then
  247.    begin
  248.      with FDialog do
  249.       if Execute then
  250.        begin
  251.          Text := FileName;
  252.          if AutoSelect then Perform(EM_SETSEL, 0, Length(Text));
  253.        end;
  254.    end
  255.   else
  256.    if Assigned(FOnButtonClick) then FOnButtonClick(Self);
  257. end;
  258.  
  259. procedure Register;
  260. begin
  261.   RegisterComponents('SheAr', [TBrowseEdit]);
  262. end;
  263.  
  264. end.
  265.