1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
|
{
/***************************************************************************
ActnList.pas
------------
***************************************************************************/
*****************************************************************************
This file is part of the Lazarus Component Library (LCL)
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
}
unit ActnList;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
LCLStrConsts, LCLType, LCLProc, LCLIntf, ImgList, LCLClasses, LMessages;
type
{ TContainedAction }
TCustomActionList = class;
TContainedAction = class(TBasicAction)
private
FCategory: string;
FActionList: TCustomActionList;
function GetIndex: Integer;
procedure SetCategory(const Value: string);
procedure SetIndex(Value: Integer);
procedure SetActionList(NewActionList: TCustomActionList);
protected
procedure ReadState(Reader: TReader); override;
procedure SetParentComponent(AParent: TComponent); override;
public
destructor Destroy; override;
function Execute: Boolean; override;
function GetParentComponent: TComponent; override;
function HasParent: Boolean; override;
function Update: Boolean; override;
property ActionList: TCustomActionList read FActionList write SetActionList;
property Index: Integer read GetIndex write SetIndex stored False;
published
property Category: string read FCategory write SetCategory;
end;
TContainedActionClass = class of TContainedAction;
{ TActionListEnumerator }
TActionListEnumerator = class
private
FList: TCustomActionList;
FPosition: Integer;
function GetCurrent: TContainedAction;
public
constructor Create(AList: TCustomActionList);
function MoveNext: Boolean;
property Current: TContainedAction read GetCurrent;
end;
{ TCustomActionList }
TActionEvent = procedure (AAction: TBasicAction; var Handled: Boolean) of object;
TActionListState = (asNormal, asSuspended, asSuspendedEnabled);
TCustomActionList = class(TLCLComponent)
private
FActions: TFPList;// list of TContainedAction
FImageChangeLink: TChangeLink;
FImages: TCustomImageList;
FOnChange: TNotifyEvent;
FOnExecute: TActionEvent;
FOnUpdate: TActionEvent;
FState: TActionListState;
function GetAction(Index: Integer): TContainedAction;
function GetActionCount: Integer;
procedure ImageListChange(Sender: TObject);
procedure SetAction(Index: Integer; Value: TContainedAction);
procedure SetState(const Value: TActionListState);
protected
procedure AddAction(Action: TContainedAction); virtual;
procedure RemoveAction(Action: TContainedAction); virtual;
procedure Change; virtual;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
procedure SetChildOrder(Component: TComponent; Order: Integer); override;
procedure SetImages(Value: TCustomImageList); virtual;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property OnExecute: TActionEvent read FOnExecute write FOnExecute;
property OnUpdate: TActionEvent read FOnUpdate write FOnUpdate;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function ActionByName(const ActionName: string): TContainedAction;
function ExecuteAction(Action: TBasicAction): Boolean; override;
function GetEnumerator: TActionListEnumerator;
function IndexOfName(const ActionName: string): integer;
function IsShortCut(var Message: TLMKey): Boolean;
function UpdateAction(Action: TBasicAction): Boolean; override;
property Actions[Index: Integer]: TContainedAction read GetAction write SetAction; default;
property ActionCount: Integer read GetActionCount;
property Images: TCustomImageList read FImages write SetImages;
property State: TActionListState read FState write SetState default asNormal;
end;
{ TActionList }
TActionList = class(TCustomActionList)
published
property Images;
property State;
property OnChange;
property OnExecute;
property OnUpdate;
end;
{ TShortCutList
List of shortcut and texts. The TShortCut values are stored in the Objects. }
TShortCutList = class(TStringList)
private
function GetShortCuts(Index: Integer): TShortCut;
public
function Add(const S: String): Integer; override;
function IndexOfShortCut(const Shortcut: TShortCut): Integer;
property ShortCuts[Index: Integer]: TShortCut read GetShortCuts;
end;
{ TCustomAction
FClients is a list of TActionLink }
THintEvent = procedure (var HintStr: string; var CanShow: Boolean) of object;
TCustomAction = class(TContainedAction)
private
FAutoCheck: Boolean;
FCaption: TTranslateString;
FChecked: Boolean;
FChecking: Boolean;
FDisableIfNoHandler: Boolean;
FEnabled: Boolean;
FGroupIndex: Integer;
FHelpContext: THelpContext;
FHelpKeyword: string;
FHelpType: THelpType;
FHint: TTranslateString;
FImageIndex: TImageIndex;
FOnHint: THintEvent;
FSavedEnabledState: Boolean;
FSecondaryShortCuts: TShortCutList;// nil as default
FShortCut: TShortCut;
FVisible: Boolean;
procedure SetAutoCheck(Value: Boolean);
procedure SetCaption(const Value: TTranslateString);
procedure SetChecked(Value: Boolean);
procedure SetEnabled(Value: Boolean);
procedure SetGroupIndex(const Value: Integer);
procedure SetHelpContext(Value: THelpContext); virtual;
procedure SetHelpKeyword(const Value: string); virtual;
procedure SetHelpType(Value: THelpType);
procedure SetHint(const Value: TTranslateString);
procedure SetImageIndex(Value: TImageIndex);
procedure SetShortCut(Value: TShortCut);
procedure SetVisible(Value: Boolean);
function GetSecondaryShortCuts: TShortCutList;
procedure SetSecondaryShortCuts(const Value: TShortCutList);
function IsSecondaryShortCutsStored: Boolean;
protected
FImage: TObject;
FMask: TObject;
procedure AssignTo(Dest: TPersistent); override;
procedure SetName(const Value: TComponentName); override;
function HandleShortCut: Boolean; virtual;
property SavedEnabledState: Boolean
read FSavedEnabledState write FSavedEnabledState;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function DoHint(var HintStr: string): Boolean; virtual;
function Execute: Boolean; override;
public
property AutoCheck: Boolean
read FAutoCheck write SetAutoCheck default False;
property Caption: TTranslateString read FCaption write SetCaption;
property Checked: Boolean read FChecked write SetChecked default False;
property DisableIfNoHandler: Boolean read FDisableIfNoHandler
write FDisableIfNoHandler default False;
property Enabled: Boolean read FEnabled write SetEnabled default True;
property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0;
property HelpContext: THelpContext
read FHelpContext write SetHelpContext default 0;
property HelpKeyword: string read FHelpKeyword write SetHelpKeyword;
property HelpType: THelpType
read FHelpType write SetHelpType default htContext;
property Hint: TTranslateString read FHint write SetHint;
property ImageIndex: TImageIndex
read FImageIndex write SetImageIndex default -1;
property OnHint: THintEvent read FOnHint write FOnHint;
property SecondaryShortCuts: TShortCutList read GetSecondaryShortCuts
write SetSecondaryShortCuts stored IsSecondaryShortCutsStored;
property ShortCut: TShortCut read FShortCut write SetShortCut default 0;
property Visible: Boolean read FVisible write SetVisible default True;
end;
{ TAction }
TAction = class(TCustomAction)
public
constructor Create(AOwner: TComponent); override;
published
property AutoCheck;
property Caption;
property Checked;
property DisableIfNoHandler default True;
property Enabled;
property GroupIndex;
property HelpContext;
property HelpKeyword;
property HelpType;
property Hint;
property ImageIndex;
property OnExecute;
property OnHint;
property OnUpdate;
property SecondaryShortCuts;
property ShortCut;
property Visible;
end;
{ TActionLink }
TActionLink = class(TBasicActionLink)
protected
procedure SetAutoCheck(Value: Boolean); virtual;
procedure SetCaption(const Value: string); virtual;
procedure SetChecked(Value: Boolean); virtual;
procedure SetEnabled(Value: Boolean); virtual;
procedure SetGroupIndex(Value: Integer); virtual;
procedure SetHelpContext(Value: THelpContext); virtual;
procedure SetHelpKeyword(const Value: string); virtual;
procedure SetHelpType(Value: THelpType); virtual;
procedure SetHint(const Value: string); virtual;
procedure SetImageIndex(Value: Integer); virtual;
procedure SetShortCut(Value: TShortCut); virtual;
procedure SetVisible(Value: Boolean); virtual;
public
function IsCaptionLinked: Boolean; virtual;
function IsCheckedLinked: Boolean; virtual;
function IsEnabledLinked: Boolean; virtual;
function IsGroupIndexLinked: Boolean; virtual;
function IsHelpContextLinked: Boolean; virtual;
function IsHelpLinked: Boolean; virtual;
function IsHintLinked: Boolean; virtual;
function IsImageIndexLinked: Boolean; virtual;
function IsShortCutLinked: Boolean; virtual;
function IsVisibleLinked: Boolean; virtual;
end;
TActionLinkClass = class of TActionLink;
type
TEnumActionProc = procedure (const Category: string;
ActionClass: TBasicActionClass; Info: Pointer) of object;
procedure RegisterActions(const CategoryName: string;
const AClasses: array of TBasicActionClass; Resource: TComponentClass);
procedure UnRegisterActions(const AClasses: array of TBasicActionClass);
procedure EnumRegisteredActions(Proc: TEnumActionProc; Info: Pointer);
function CreateAction(TheOwner: TComponent;
ActionClass: TBasicActionClass): TBasicAction;
const
RegisterActionsProc: procedure (const CategoryName: string;
const AClasses: array of TBasicActionClass;
Resource: TComponentClass)= nil;
UnRegisterActionsProc: procedure(const AClasses: array of TBasicActionClass
) = nil;
EnumRegisteredActionsProc: procedure(Proc: TEnumActionProc;
Info: Pointer) = nil;
CreateActionProc: function(TheOwner: TComponent;
ActionClass: TBasicActionClass): TBasicAction = nil;
var
ApplicationActionComponent: TComponent = nil;
procedure Register;
implementation
procedure RegisterActions(const CategoryName: string;
const AClasses: array of TBasicActionClass; Resource: TComponentClass);
begin
if Assigned(RegisterActionsProc) then
RegisterActionsProc(CategoryName, AClasses, Resource)
else
raise Exception.Create(SInvalidActionRegistration);
end;
procedure UnRegisterActions(const AClasses: array of TBasicActionClass);
begin
if Assigned(UnRegisterActionsProc) then
UnRegisterActionsProc(AClasses)
else
raise Exception.Create(SInvalidActionUnregistration);
end;
procedure EnumRegisteredActions(Proc: TEnumActionProc; Info: Pointer);
begin
if Assigned(EnumRegisteredActionsProc) then
EnumRegisteredActionsProc(Proc, Info)
else
raise Exception.Create(SInvalidActionEnumeration);
end;
function CreateAction(TheOwner: TComponent;
ActionClass: TBasicActionClass): TBasicAction;
begin
if Assigned(CreateActionProc) then
Result := CreateActionProc(TheOwner, ActionClass)
else
raise Exception.Create(SInvalidActionCreation);
end;
{$I containedaction.inc}
{$I customactionlist.inc}
{$I actionlink.inc}
{$I shortcutlist.inc}
{$I customaction.inc}
{$I lclaction.inc}
{ TActionListEnumerator }
function TActionListEnumerator.GetCurrent: TContainedAction;
begin
Result := FList.Actions[FPosition];
end;
constructor TActionListEnumerator.Create(AList: TCustomActionList);
begin
inherited Create;
FList := AList;
FPosition := -1;
end;
function TActionListEnumerator.MoveNext: Boolean;
begin
inc(FPosition);
Result := FPosition < FList.ActionCount;
end;
procedure Register;
begin
RegisterComponents('Standard',[TActionList]);
RegisterNoIcon([TAction]);
end;
initialization
ApplicationActionComponent:=nil;
end.
|