1{ 2 /*************************************************************************** 3 dbactns.pp 4 ---------- 5 ***************************************************************************/ 6 7 ***************************************************************************** 8 This file is part of the Lazarus Component Library (LCL) 9 10 See the file COPYING.modifiedLGPL.txt, included in this distribution, 11 for details about the license. 12 ***************************************************************************** 13} 14{$mode objfpc}{$h+} 15unit DBActns; 16 17interface 18 19uses Classes, DB, ActnList; 20 21type 22 23{ --------------------------------------------------------------------- 24 TDatasetAction - Parent for all other TDataset actions. 25 ---------------------------------------------------------------------} 26 27 TDataSetAction = Class(TAction) 28 Private 29 FDataSource: TDataSource; 30 procedure SetDataSource(Value: TDataSource); 31 Protected 32 procedure Notification(AComponent: TComponent; Operation: TOperation); override; 33 function GetDataSet(Target: TObject): TDataSet; virtual; 34 Public 35 function HandlesTarget(Target: TObject): Boolean; override; 36 property DataSource: TDataSource read FDataSource write SetDataSource; 37 end; 38 39{ --------------------------------------------------------------------- 40 Navigation Actions 41 ---------------------------------------------------------------------} 42 43 TDataSetFirst = Class(TDataSetAction) 44 Public 45 procedure ExecuteTarget(Target: TObject); override; 46 procedure UpdateTarget(Target: TObject); override; 47 Published 48 property DataSource; 49 end; 50 51 TDataSetLast = Class(TDataSetAction) 52 Public 53 procedure ExecuteTarget(Target: TObject); override; 54 procedure UpdateTarget(Target: TObject); override; 55 Published 56 property DataSource; 57 end; 58 59 TDataSetNext = Class(TDataSetAction) 60 Public 61 procedure ExecuteTarget(Target: TObject); override; 62 procedure UpdateTarget(Target: TObject); override; 63 Published 64 property DataSource; 65 end; 66 67 TDataSetPrior = Class(TDataSetAction) 68 Public 69 procedure ExecuteTarget(Target: TObject); override; 70 procedure UpdateTarget(Target: TObject); override; 71 Published 72 property DataSource; 73 end; 74 75 TDataSetRefresh = Class(TDataSetAction) 76 Public 77 procedure ExecuteTarget(Target: TObject); override; 78 procedure UpdateTarget(Target: TObject); override; 79 Published 80 property DataSource; 81 end; 82 83 84{ --------------------------------------------------------------------- 85 Data manipulation actions 86 ---------------------------------------------------------------------} 87 88 TDataSetCancel = Class(TDataSetAction) 89 Public 90 procedure ExecuteTarget(Target: TObject); override; 91 procedure UpdateTarget(Target: TObject); override; 92 Published 93 property DataSource; 94 end; 95 96 TDataSetDelete = Class(TDataSetAction) 97 Public 98 procedure ExecuteTarget(Target: TObject); override; 99 procedure UpdateTarget(Target: TObject); override; 100 Published 101 property DataSource; 102 end; 103 104 TDataSetEdit = Class(TDataSetAction) 105 Public 106 procedure ExecuteTarget(Target: TObject); override; 107 procedure UpdateTarget(Target: TObject); override; 108 Published 109 property DataSource; 110 end; 111 112 TDataSetInsert = Class(TDataSetAction) 113 Public 114 procedure ExecuteTarget(Target: TObject); override; 115 procedure UpdateTarget(Target: TObject); override; 116 Published 117 property DataSource; 118 end; 119 120 TDataSetPost = Class(TDataSetAction) 121 Public 122 procedure ExecuteTarget(Target: TObject); override; 123 procedure UpdateTarget(Target: TObject); override; 124 Published 125 property DataSource; 126 end; 127 128 129procedure Register; 130 131implementation 132 133procedure Register; 134begin 135 RegisterNoIcon([TDataSetFirst,TDataSetLast,TDataSetNext, 136 TDataSetPrior,TDataSetRefresh,TDataSetCancel,TDataSetDelete,TDataSetEdit, 137 TDataSetInsert,TDataSetPost]); 138end; 139 140 141{ --------------------------------------------------------------------- 142 TDatasetAction 143 ---------------------------------------------------------------------} 144 145function TDataSetAction.GetDataSet(Target: TObject): TDataSet; 146begin 147 Result:=(Target as TDataSource).DataSet; 148end; 149 150function TDataSetAction.HandlesTarget(Target: TObject): Boolean; 151 152begin 153 Result:=(DataSource<>Nil); 154 if Result and (DataSource=Target) then 155 Result:=(DataSource.DataSet<>Nil) 156 else 157 Result:=(Target is TDataSource) and (TDataSource(Target).DataSet<>Nil); 158end; 159 160 161procedure TDataSetAction.Notification(AComponent: TComponent; 162 Operation: TOperation); 163begin 164 inherited Notification(AComponent,Operation); 165 if (Operation=opRemove) and 166 (AComponent=DataSource) then 167 FDataSource:=Nil; 168end; 169 170 171procedure TDataSetAction.SetDataSource(Value: TDataSource); 172begin 173 if (Value<>FDataSource) then 174 begin 175 FDataSource:=Value; 176 if (Value<>Nil) then 177 Value.FreeNotification(Self); 178 end; 179end; 180 181 182{ --------------------------------------------------------------------- 183 TDatasetFirst 184 ---------------------------------------------------------------------} 185 186procedure TDataSetFirst.ExecuteTarget(Target: TObject); 187begin 188 GetDataSet(Target).First; 189end; 190 191 192procedure TDataSetFirst.UpdateTarget(Target: TObject); 193begin 194 With GetDataSet(Target) do 195 Enabled:=Active and not BOF; 196end; 197 198 199{ --------------------------------------------------------------------- 200 TDataSetLast 201 ---------------------------------------------------------------------} 202 203procedure TDataSetLast.ExecuteTarget(Target: TObject); 204begin 205 GetDataSet(Target).Last; 206end; 207 208 209procedure TDataSetLast.UpdateTarget(Target: TObject); 210begin 211 with GetDataSet(Target) do 212 Enabled:=Active and not EOF; 213end; 214 215 216{ --------------------------------------------------------------------- 217 TDataSetNext 218 ---------------------------------------------------------------------} 219 220procedure TDataSetNext.ExecuteTarget(Target: TObject); 221begin 222 GetDataSet(Target).Next; 223end; 224 225 226procedure TDataSetNext.UpdateTarget(Target: TObject); 227begin 228 with GetDataSet(Target) do 229 Enabled:=Active and not Eof; 230end; 231 232 233{ --------------------------------------------------------------------- 234 TDataSetPrior 235 ---------------------------------------------------------------------} 236 237procedure TDataSetPrior.ExecuteTarget(Target: TObject); 238begin 239 GetDataSet(Target).Prior; 240end; 241 242 243procedure TDataSetPrior.UpdateTarget(Target: TObject); 244begin 245 with GetDataSet(Target) do 246 Enabled:=Active and not BOF; 247end; 248 249 250{ --------------------------------------------------------------------- 251 TDataSetRefresh 252 ---------------------------------------------------------------------} 253 254procedure TDataSetRefresh.ExecuteTarget(Target: TObject); 255begin 256 GetDataSet(Target).Refresh; 257end; 258 259 260procedure TDataSetRefresh.UpdateTarget(Target: TObject); 261begin 262 with GetDataSet(Target) do 263 Enabled:=Active; 264end; 265 266 267{ --------------------------------------------------------------------- 268 TDatasetInsert 269 ---------------------------------------------------------------------} 270 271procedure TDataSetInsert.ExecuteTarget(Target: TObject); 272begin 273 GetDataSet(Target).Insert; 274end; 275 276procedure TDataSetInsert.UpdateTarget(Target: TObject); 277begin 278 with GetDataSet(Target) do 279 Enabled:=Active and CanModify and not (State in dsEditModes); 280end; 281 282 283{ --------------------------------------------------------------------- 284 TDataSetPost 285 ---------------------------------------------------------------------} 286 287procedure TDataSetPost.ExecuteTarget(Target: TObject); 288begin 289 GetDataSet(Target).Post; 290end; 291 292procedure TDataSetPost.UpdateTarget(Target: TObject); 293begin 294 with GetDataSet(Target) do 295 Enabled:=Active and (State in dsEditModes); 296end; 297 298{ --------------------------------------------------------------------- 299 TDataSetCancel 300 ---------------------------------------------------------------------} 301 302procedure TDataSetCancel.ExecuteTarget(Target: TObject); 303begin 304 GetDataSet(Target).Cancel; 305end; 306 307 308procedure TDataSetCancel.UpdateTarget(Target: TObject); 309begin 310 with GetDataSet(Target) do 311 Enabled:=Active and (State in dsEditModes); 312end; 313 314 315{ --------------------------------------------------------------------- 316 TDataSetEdit 317 ---------------------------------------------------------------------} 318 319procedure TDataSetEdit.ExecuteTarget(Target: TObject); 320begin 321 GetDataSet(Target).Edit; 322end; 323 324 325procedure TDataSetEdit.UpdateTarget(Target: TObject); 326begin 327 with GetDataSet(Target) do 328 Enabled:=Active and CanModify and not (State in dsEditModes); 329end; 330 331 332{ --------------------------------------------------------------------- 333 TDataSetDelete 334 ---------------------------------------------------------------------} 335 336procedure TDataSetDelete.ExecuteTarget(Target: TObject); 337begin 338 GetDataSet(Target).Delete; 339end; 340 341 342procedure TDataSetDelete.UpdateTarget(Target: TObject); 343begin 344 with GetDataSet(Target) do 345 Enabled:=Active and (not (BOF and EOF)) and CanModify; 346end; 347 348 349end. 350