GuiWorkspace.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:9k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit GuiWorkspace;
  2. //---------------------------------------------------------------------------
  3. // GuiWorkspace.pas                                     Modified: 04-Feb-2007
  4. // The workspace for Asphyre GUI foundation                       Version 1.1
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is GuiWorkspace.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Classes, Controls, Vectors2px, GuiTypes, GuiObjects, GuiControls;
  41. //---------------------------------------------------------------------------
  42. type
  43.  TGuiWorkspace = class(TGuiControl)
  44.  private
  45.   FMousePos : TPoint2px;
  46.   LastButton: TMouseButtonType;
  47.   LastShift : TShiftState;
  48.   LastOver  : TGuiControl;
  49.   LastClick : TGuiControl;
  50.   ClickLevel: Integer;
  51.  protected
  52.   procedure DoMouseEvent(const Pos: TPoint2px; Event: TMouseEventType;
  53.    Button: TMouseButtonType; SpecialKeys: TSpecialKeyState); override;
  54.   procedure DoKeyEvent(Key: Integer; Event: TKeyEventType;
  55.    SpecialKeys: TSpecialKeyState); override;
  56.  public
  57.   property MousePos: TPoint2px read FMousePos;
  58.   procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  59.   procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  60.   procedure MouseMove(Shift: TShiftState; X, Y: Integer);
  61.   procedure KeyDown(Key: Word; Shift: TShiftState);
  62.   procedure KeyUp(Key: Word; Shift: TShiftState);
  63.   procedure KeyPress(Key: Char);
  64.   procedure Click();
  65.   procedure DblClick();
  66.   function FindCtrlAt(const Point: TPoint2px): TGuiControl; override;
  67.   // Clears LastOver and LastClick references since the control is
  68.   // being deleted.
  69.   procedure RemoveRef();
  70.   procedure Draw();
  71.   constructor Create(AOwner: TGuiObject); override;
  72.  end;
  73. //---------------------------------------------------------------------------
  74. implementation
  75. //---------------------------------------------------------------------------
  76. uses
  77.  GuiUtils, GuiForms;
  78. //---------------------------------------------------------------------------
  79. constructor TGuiWorkspace.Create(AOwner: TGuiObject);
  80. begin
  81.  inherited;
  82.  FMousePos := Point(0, 0);
  83.  LastOver  := nil;
  84.  ClickLevel:= 0;
  85. end;
  86. //---------------------------------------------------------------------------
  87. procedure TGuiWorkspace.MouseDown(Button: TMouseButton; Shift: TShiftState;
  88.  X, Y: Integer);
  89. begin
  90.  FMousePos := Point(X, Y);
  91.  LastButton:= Button2Gui(Button);
  92.  LastShift := Shift;
  93.  AcceptMouse(FMousePos, metDown, LastButton, ShiftState2Special(LastShift));
  94. end;
  95. //---------------------------------------------------------------------------
  96. procedure TGuiWorkspace.MouseMove(Shift: TShiftState; X, Y: Integer);
  97. begin
  98.  FMousePos := Point(X, Y);
  99.  LastButton:= mbtUnknown;
  100.  LastShift := Shift;
  101.  AcceptMouse(FMousePos, metMove, LastButton, ShiftState2Special(LastShift));
  102. end;
  103. //---------------------------------------------------------------------------
  104. procedure TGuiWorkspace.MouseUp(Button: TMouseButton; Shift: TShiftState;
  105.  X, Y: Integer);
  106. begin
  107.  FMousePos := Point(X, Y);
  108.  LastButton:= Button2Gui(Button);
  109.  LastShift := Shift;
  110.  AcceptMouse(FMousePos, metUp, LastButton, ShiftState2Special(LastShift));
  111. end;
  112. //---------------------------------------------------------------------------
  113. procedure TGuiWorkspace.Click();
  114. begin
  115.  AcceptMouse(FMousePos, metClick, LastButton, ShiftState2Special(LastShift));
  116. end;
  117. //---------------------------------------------------------------------------
  118. procedure TGuiWorkspace.DblClick();
  119. begin
  120.  AcceptMouse(FMousePos, metDblClick, LastButton, ShiftState2Special(LastShift));
  121. end;
  122. //---------------------------------------------------------------------------
  123. procedure TGuiWorkspace.KeyPress(Key: Char);
  124. begin
  125.  AcceptKey(Byte(Key), ketPress, []);
  126. end;
  127. //---------------------------------------------------------------------------
  128. procedure TGuiWorkspace.KeyDown(Key: Word; Shift: TShiftState);
  129. begin
  130.  AcceptKey(Byte(Key), ketDown, ShiftState2Special(Shift));
  131. end;
  132. //---------------------------------------------------------------------------
  133. procedure TGuiWorkspace.KeyUp(Key: Word; Shift: TShiftState);
  134. begin
  135.  AcceptKey(Byte(Key), ketUp, ShiftState2Special(Shift));
  136. end;
  137. //---------------------------------------------------------------------------
  138. procedure TGuiWorkspace.DoMouseEvent(const Pos: TPoint2px; Event: TMouseEventType;
  139.  Button: TMouseButtonType; SpecialKeys: TSpecialKeyState);
  140. var
  141.  CtrlOver : TGuiControl;
  142.  EventCtrl: TGuiControl;
  143. begin
  144.  // (1) Find the control pointed by the mouse.
  145.  CtrlOver:= FindCtrlAt(MousePos);
  146.  // (2) Whom to send mouse event?
  147.  EventCtrl:= CtrlOver;
  148.  if (LastClick <> nil) then EventCtrl:= LastClick;
  149.  // (3) Check whether a user pressed mouse button.
  150.  if (Event = metDown)and(CtrlOver <> nil) then
  151.   begin
  152.    if (ClickLevel <= 0) then
  153.     begin
  154.      CtrlOver.SetFocus();
  155.      LastClick:= CtrlOver;
  156.     end;
  157.    if (LastClick is TGuiForm) then LastClick.SetFocus();
  158.    Inc(ClickLevel);
  159.   end;
  160.  // (4) Verify if the user released mouse button.
  161.  if (Event = metUp) then
  162.   begin
  163.    Dec(ClickLevel);
  164.    if (ClickLevel <= 0) then LastClick:= nil;
  165.   end;
  166.  // (5) Notify control pointed by the mouse that it is being ENTERED
  167.  if (ClickLevel <= 0)and(LastOver <> CtrlOver) then
  168.   begin
  169.    if (CtrlOver <> nil) then
  170.     begin
  171.      CtrlOver.AcceptMouse(MousePos, metEnter, Button, SpecialKeys);
  172. //     CtrlOver.SkinAlpha:= 128;
  173.     end;
  174.   end;
  175.  // (6) Send the mouse event
  176.  if (EventCtrl <> nil)and(EventCtrl.Enabled) then
  177.   EventCtrl.AcceptMouse(MousePos, Event, Button, SpecialKeys);
  178.  // (7) Notify control no longer pointed by the mouse, that it is LEFT
  179.  if (ClickLevel <= 0)and(LastOver <> CtrlOver) then
  180.   begin
  181.    if (LastOver <> nil) then
  182.     begin
  183.      LastOver.AcceptMouse(MousePos, metLeave, Button, SpecialKeys);
  184. //     LastOver.SkinAlpha:= 255;
  185.     end;
  186.     
  187.    LastOver:= CtrlOver;
  188.   end;
  189. end;
  190. //---------------------------------------------------------------------------
  191. function TGuiWorkspace.FindCtrlAt(const Point: TPoint2px): TGuiControl;
  192. var
  193.  Index: Integer;
  194. begin
  195.  Result:= nil;
  196.  for Index:= 0 to ChildCount - 1 do
  197.   if (Child[Index] is TGuiControl) then
  198.    begin
  199.     Result:= TGuiControl(Child[Index]).FindCtrlAt(Point);
  200.     if (Result <> nil) then Break;
  201.    end;
  202. end;
  203. //---------------------------------------------------------------------------
  204. procedure TGuiWorkspace.DoKeyEvent(Key: Integer; Event: TKeyEventType;
  205.  SpecialKeys: TSpecialKeyState);
  206. var
  207.  FocusChild: TGuiObject;
  208. begin
  209.  FocusChild:= Child[FocusIndex];
  210.  if (FocusChild <> nil)and(FocusChild is TGuiControl) then
  211.   TGuiControl(FocusChild).AcceptKey(Key, Event, SpecialKeys);
  212. end;
  213. //---------------------------------------------------------------------------
  214. procedure TGuiWorkspace.RemoveRef();
  215. begin
  216.  LastOver:= nil;
  217.  LastClick:= nil;
  218. end;
  219. //---------------------------------------------------------------------------
  220. procedure TGuiWorkspace.Draw();
  221. begin
  222.  DrawAt(ZeroPoint2px);
  223. end;
  224. //---------------------------------------------------------------------------
  225. end.