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