scroll.pas 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 2000 by B'rczi, Gÿbor
  5. member of the Free Pascal development team
  6. Support objects for the install program
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit Scroll;
  14. interface
  15. uses Objects,
  16. FVConsts,
  17. Drivers,Views,App;
  18. const
  19. CScrollBoxBackground = #6;
  20. type
  21. PScrollBoxBackground = ^TScrollBoxBackground;
  22. TScrollBoxBackground = object(TBackground)
  23. function GetPalette: PPalette; virtual;
  24. end;
  25. PScrollBox = ^TScrollBox;
  26. TScrollBox = object(TGroup)
  27. Delta,Limit: TPoint;
  28. HScrollBar,VScrollBar: PScrollBar;
  29. Background: PScrollBoxBackground;
  30. constructor Init(var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar);
  31. procedure InitBackground; virtual;
  32. procedure HandleEvent(var Event: TEvent); virtual;
  33. procedure ChangeBounds(var Bounds: TRect); virtual;
  34. procedure ScrollDraw; virtual;
  35. procedure ScrollTo(X, Y: Sw_Integer);
  36. procedure SetLimit(X, Y: Sw_Integer);
  37. procedure SetState(AState: Word; Enable: Boolean); virtual;
  38. procedure TrackCursor;
  39. procedure Draw; virtual;
  40. function ClipChilds: boolean; virtual;
  41. procedure BeforeInsert(P: PView); virtual;
  42. procedure AfterInsert(P: PView); virtual;
  43. procedure AfterDelete(P: PView); virtual;
  44. private
  45. DrawLock: Byte;
  46. DrawFlag: Boolean;
  47. procedure CheckDraw;
  48. procedure UpdateLimits;
  49. procedure ShiftViews(DX,DY: sw_integer);
  50. end;
  51. implementation
  52. function TScrollBoxBackground.GetPalette: PPalette;
  53. const P: string[length(CScrollBoxBackground)] = CScrollBoxBackground;
  54. begin
  55. GetPalette:=@P;
  56. end;
  57. constructor TScrollBox.Init(var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar);
  58. begin
  59. inherited Init(Bounds);
  60. EventMask:=EventMask or evBroadcast;
  61. HScrollBar:=AHScrollBar; VScrollBar:=AVScrollBar;
  62. InitBackground;
  63. if Assigned(Background) then Insert(Background);
  64. ReDraw;
  65. end;
  66. procedure TScrollBox.InitBackground;
  67. var R: TRect;
  68. begin
  69. GetExtent(R);
  70. New(Background, Init(R,' '));
  71. end;
  72. procedure TScrollBox.HandleEvent(var Event: TEvent);
  73. begin
  74. if (Event.What=evBroadcast) and (Event.Command=cmCursorChanged) then
  75. TrackCursor;
  76. inherited HandleEvent(Event);
  77. end;
  78. procedure TScrollBox.ChangeBounds(var Bounds: TRect);
  79. begin
  80. SetBounds(Bounds);
  81. Inc(DrawLock);
  82. SetLimit(Limit.X, Limit.Y);
  83. Dec(DrawLock);
  84. DrawFlag := False;
  85. DrawView;
  86. end;
  87. procedure TScrollBox.CheckDraw;
  88. begin
  89. if (DrawLock = 0) and DrawFlag then
  90. begin
  91. DrawFlag := False;
  92. ReDraw; DrawView;
  93. end;
  94. end;
  95. procedure TScrollBox.ScrollDraw;
  96. var
  97. D: TPoint;
  98. begin
  99. if HScrollBar <> nil then
  100. D.X := HScrollBar^.Value
  101. else
  102. D.X := 0;
  103. if VScrollBar <> nil then
  104. D.Y := VScrollBar^.Value
  105. else
  106. D.Y := 0;
  107. if (D.X <> Delta.X) or (D.Y <> Delta.Y) then
  108. begin
  109. SetCursor(Cursor.X + Delta.X - D.X, Cursor.Y + Delta.Y - D.Y);
  110. Delta := D;
  111. if DrawLock <> 0 then
  112. DrawFlag := True
  113. else
  114. DrawView;
  115. end;
  116. end;
  117. procedure TScrollBox.ScrollTo(X, Y: Sw_Integer);
  118. var DX,DY: sw_integer;
  119. begin
  120. Inc(DrawLock);
  121. DX:=Delta.X-X;
  122. DY:=Delta.Y-Y;
  123. if HScrollBar <> nil then
  124. HScrollBar^.SetValue(X);
  125. if VScrollBar <> nil then
  126. VScrollBar^.SetValue(Y);
  127. ShiftViews(DX,DY);
  128. Dec(DrawLock);
  129. CheckDraw;
  130. end;
  131. procedure TScrollBox.ShiftViews(DX,DY: sw_integer);
  132. procedure DoShift(P: PView);
  133. begin
  134. P^.MoveTo(P^.Origin.X+DX,P^.Origin.Y+DY);
  135. end;
  136. begin
  137. ForEach(@DoShift);
  138. end;
  139. procedure TScrollBox.SetLimit(X, Y: Sw_Integer);
  140. begin
  141. Limit.X := X;
  142. Limit.Y := Y;
  143. Inc(DrawLock);
  144. if HScrollBar <> nil then
  145. HScrollBar^.SetParams(HScrollBar^.Value, 0, X - Size.X, Size.X - 1, HScrollBar^.ArStep);
  146. if VScrollBar <> nil then
  147. VScrollBar^.SetParams(VScrollBar^.Value, 0, Y - Size.Y, Size.Y - 1, VScrollBar^.ArStep);
  148. Dec(DrawLock);
  149. CheckDraw;
  150. end;
  151. procedure TScrollBox.SetState(AState: Word; Enable: Boolean);
  152. procedure ShowSBar(SBar: PScrollBar);
  153. begin
  154. if (SBar <> nil) then
  155. if GetState(sfActive + sfSelected) then
  156. SBar^.Show
  157. else
  158. SBar^.Hide;
  159. end;
  160. var OState: word;
  161. begin
  162. OState:=State;
  163. inherited SetState(AState, Enable);
  164. if AState and (sfActive + sfSelected) <> 0 then
  165. begin
  166. ShowSBar(HScrollBar);
  167. ShowSBar(VScrollBar);
  168. end;
  169. if ((OState xor State) and (sfFocused))<>0 then
  170. TrackCursor;
  171. end;
  172. procedure TScrollBox.TrackCursor;
  173. var V: PView;
  174. P,ND: TPoint;
  175. begin
  176. V:=Current;
  177. if (not Assigned(V)) then Exit;
  178. P.X:=V^.Origin.X+V^.Cursor.X;
  179. P.Y:=V^.Origin.Y+V^.Cursor.Y;
  180. ND:=Delta;
  181. if (P.X<0) then
  182. Dec(ND.X,-P.X)
  183. else
  184. if (P.X>=Size.X) then
  185. Inc(ND.X,P.X-(Size.X-1));
  186. if (P.Y<0) then
  187. Dec(ND.Y,-P.Y)
  188. else
  189. if (P.Y>=Size.Y) then
  190. Inc(ND.Y,P.Y-(Size.Y-1));
  191. if (ND.X<>Delta.X) or (ND.Y<>Delta.Y) then
  192. ScrollTo(ND.X,ND.Y);
  193. end;
  194. function TScrollBox.ClipChilds: boolean;
  195. begin
  196. ClipChilds:=false;
  197. end;
  198. procedure TScrollBox.BeforeInsert(P: PView);
  199. begin
  200. if Assigned(P) then
  201. P^.MoveTo(P^.Origin.X-Delta.X,P^.Origin.Y-Delta.Y);
  202. end;
  203. procedure TScrollBox.AfterInsert(P: PView);
  204. begin
  205. UpdateLimits;
  206. end;
  207. procedure TScrollBox.AfterDelete(P: PView);
  208. begin
  209. { UpdateLimits;
  210. removed because it creates GPF PM }
  211. end;
  212. procedure TScrollBox.Draw;
  213. begin
  214. inherited Draw;
  215. end;
  216. procedure TScrollBox.UpdateLimits;
  217. var Max: TPoint;
  218. procedure Check(P: PView);
  219. var O: TPoint;
  220. begin
  221. O.X:=P^.Origin.X+P^.Size.X+Delta.X;
  222. O.Y:=P^.Origin.Y+P^.Size.Y+Delta.Y;
  223. if O.X>Max.X then
  224. Max.X:=O.X;
  225. if O.Y>Max.Y then
  226. Max.Y:=O.Y;
  227. end;
  228. begin
  229. Max.X:=0; Max.Y:=0;
  230. ForEach(@Check);
  231. if (Max.X<>Limit.X) or (Max.Y<>Limit.Y) then
  232. SetLimit(Max.X,Max.Y);
  233. end;
  234. END.
  235. {
  236. $Log$
  237. Revision 1.6 2004-12-22 15:28:48 peter
  238. * more fixes for win32 installer
  239. Revision 1.5 2004/12/21 18:52:31 peter
  240. checkbox mask works, scrollbox still not
  241. Revision 1.4 2004/12/20 18:27:00 peter
  242. * win32 fixes
  243. Revision 1.3 2002/09/07 15:40:59 peter
  244. * old logs removed and tabs fixed
  245. Revision 1.2 2002/01/29 22:01:17 peter
  246. * support fvision
  247. Revision 1.1 2002/01/29 17:59:15 peter
  248. * moved installer
  249. }