1{ $Id: wspairsplitter.pp 61929 2019-09-26 17:25:46Z martin $}
2{
3 *****************************************************************************
4 *                             WSPairSplitter.pp                             *
5 *                             -----------------                             *
6 *                                                                           *
7 *                                                                           *
8 *****************************************************************************
9
10 *****************************************************************************
11  This file is part of the Lazarus Component Library (LCL)
12
13  See the file COPYING.modifiedLGPL.txt, included in this distribution,
14  for details about the license.
15 *****************************************************************************
16}
17unit WSPairSplitter;
18
19{$mode objfpc}{$H+}
20{$I lcl_defines.inc}
21
22interface
23////////////////////////////////////////////////////
24// I M P O R T A N T
25////////////////////////////////////////////////////
26// 1) Only class methods allowed
27// 2) Class methods have to be published and virtual
28// 3) To get as little as posible circles, the uses
29//    clause should contain only those LCL units
30//    needed for registration. WSxxx units are OK
31// 4) To improve speed, register only classes in the
32//    initialization section which actually
33//    implement something
34// 5) To enable your XXX widgetset units, look at
35//    the uses clause of the XXXintf.pp
36////////////////////////////////////////////////////
37uses
38////////////////////////////////////////////////////
39// To get as little as posible circles,
40// uncomment only when needed for registration
41  Controls, ExtCtrls, PairSplitter, WSLCLClasses, WSControls, WSFactory;
42
43type
44  { TWSPairSplitterSide }
45
46  TWSPairSplitterSide = class(TWSWinControl)
47  published
48  end;
49
50  { TWSCustomPairSplitter }
51
52  TWSCustomPairSplitter = class(TWSWinControl)
53  published
54    class function AddSide(ASplitter: TCustomPairSplitter; ASide: TPairSplitterSide; Side: integer): Boolean; virtual;
55    class function RemoveSide(ASplitter: TCustomPairSplitter; ASide: TPairSplitterSide; Side: integer): Boolean; virtual;
56    class function GetPosition(ASplitter: TCustomPairSplitter): Integer; virtual;
57    class function SetPosition(ASplitter: TCustomPairSplitter; var NewPosition: integer): Boolean; virtual;
58
59    // special cursor handling
60    class function GetSplitterCursor(ASplitter: TCustomPairSplitter; var ACursor: TCursor): Boolean; virtual;
61    class function SetSplitterCursor(ASplitter: TCustomPairSplitter; ACursor: TCursor): Boolean; virtual;
62  end;
63  TWSCustomPairSplitterClass = class of TWSCustomPairSplitter;
64
65  { WidgetSetRegistration }
66
67  procedure RegisterPairSplitterSide;
68  procedure RegisterCustomPairSplitter;
69
70implementation
71uses
72  WSProc;
73
74function GetInternalSplitter(ASplitter: TCustomPairSplitter): TSplitter;
75var
76  i: integer;
77begin
78  Result := nil;
79  for i := 0 to ASplitter.ControlCount - 1 do
80    if ASplitter.Controls[i] is TSplitter then
81    begin
82      Result := TSplitter(ASplitter.Controls[i]);
83      break;
84    end;
85end;
86
87{ TWSCustomPairSplitter }
88
89class function TWSCustomPairSplitter.AddSide(ASplitter: TCustomPairSplitter;
90  ASide: TPairSplitterSide; Side: integer): Boolean;
91var
92  InternalSplitter: TSplitter;
93begin
94  // this implementation can be common for all widgetsets and should be
95  // overrided only if widgetset support such controls itself
96
97  Result := False;
98  if not (WSCheckHandleAllocated(ASplitter, 'AddSide - splitter') and
99          WSCheckHandleAllocated(ASide, 'AddSide - side'))
100  then Exit;
101
102  if (Side < 0) or (Side > 1) then exit;
103
104  if Side = 0 then
105  begin
106    if ASplitter.SplitterType = pstHorizontal then
107      ASide.Align := alLeft
108    else
109      ASide.Align := alTop;
110  end else
111  begin
112    InternalSplitter := GetInternalSplitter(ASplitter);
113    if InternalSplitter = nil then
114    begin
115      InternalSplitter := TSplitter.Create(ASplitter);
116      InternalSplitter.AutoSnap := False;
117      InternalSplitter.MinSize := 1;
118      InternalSplitter.Parent := ASplitter;
119    end;
120    InternalSplitter.Align := ASplitter.Sides[0].Align;
121    if ASplitter.SplitterType = pstHorizontal then
122      InternalSplitter.Left := ASplitter.Sides[0].Width + 1
123    else
124      InternalSplitter.Top := ASplitter.Sides[0].Height + 1;
125    ASide.Align := alClient;
126  end;
127
128  Result := True;
129end;
130
131class function TWSCustomPairSplitter.RemoveSide(ASplitter: TCustomPairSplitter;
132  ASide: TPairSplitterSide; Side: integer): Boolean;
133begin
134  Result := False;
135end;
136
137class function TWSCustomPairSplitter.GetPosition(ASplitter: TCustomPairSplitter): Integer;
138begin
139  if WSCheckHandleAllocated(ASplitter, 'GetPosition') then
140  begin
141    if ASplitter.SplitterType = pstHorizontal then
142      Result := ASplitter.Sides[0].Width
143    else
144      Result := ASplitter.Sides[0].Height;
145  end else
146    Result := ASplitter.Position;
147end;
148
149class function TWSCustomPairSplitter.SetPosition(
150  ASplitter: TCustomPairSplitter; var NewPosition: integer): Boolean;
151var
152  InternalSplitter: TSplitter;
153begin
154  Result := False;
155  if not WSCheckHandleAllocated(ASplitter, 'SetPosition')
156  then Exit;
157
158  if NewPosition >= 0 then
159  begin
160    InternalSplitter := GetInternalSplitter(ASplitter);
161    if ASplitter.SplitterType = pstHorizontal then
162    begin
163      ASplitter.Sides[0].Width := NewPosition;
164      if InternalSplitter <> nil then
165        InternalSplitter.Left := NewPosition + 1;
166    end else
167    begin
168      ASplitter.Sides[0].Height := NewPosition;
169      if InternalSplitter <> nil then
170        InternalSplitter.Top := NewPosition + 1;
171    end;
172  end;
173  if ASplitter.SplitterType = pstHorizontal then
174    NewPosition := ASplitter.Sides[0].Width
175  else
176    NewPosition := ASplitter.Sides[0].Height;
177
178  Result := True;
179end;
180
181class function TWSCustomPairSplitter.GetSplitterCursor(ASplitter: TCustomPairSplitter; var ACursor: TCursor): Boolean;
182var
183  InternalSplitter: TSplitter;
184begin
185  Result := True;
186  InternalSplitter := GetInternalSplitter(ASplitter);
187  if InternalSplitter <> nil then
188    ACursor := InternalSplitter.Cursor
189  else
190    ACursor := crDefault;
191end;
192
193class function TWSCustomPairSplitter.SetSplitterCursor(ASplitter: TCustomPairSplitter; ACursor: TCursor): Boolean;
194var
195  InternalSplitter: TSplitter;
196begin
197  Result := True;
198  InternalSplitter := GetInternalSplitter(ASplitter);
199  if InternalSplitter <> nil then
200  begin
201    InternalSplitter.Cursor := ACursor;
202    ASplitter.Sides[0].Cursor := crArrow;
203    ASplitter.Sides[1].Cursor := crArrow;
204  end;
205end;
206
207  { WidgetSetRegistration }
208
209procedure RegisterPairSplitterSide;
210const
211  Done: Boolean = False;
212begin
213  if Done then exit;
214  WSRegisterPairSplitterSide;
215//  if not WSRegisterPairSplitterSide then
216//    RegisterWSComponent(TPairSplitterSide, TWSPairSplitterSide);
217  Done := True;
218end;
219
220procedure RegisterCustomPairSplitter;
221const
222  Done: Boolean = False;
223begin
224  if Done then exit;
225  if not WSRegisterCustomPairSplitter then
226    RegisterWSComponent(TCustomPairSplitter, TWSCustomPairSplitter);
227  Done := True;
228end;
229
230end.
231