* Add Focus and ReplaceClasses/AddRemoveClasses

This commit is contained in:
michael 2020-11-25 11:15:19 +00:00
parent 68b631ac85
commit 1308f6be51

View File

@ -453,10 +453,16 @@ Type
// Does this element allow childern ? // Does this element allow childern ?
Class Function AllowChildren : Boolean; virtual; Class Function AllowChildren : Boolean; virtual;
// Manipulate Classes // Manipulate Classes
Class Function AddRemoveClasses(const Source, aAddClasses, aRemoveClasses : String; Normalize : Boolean = false) : String;
// Number of classes in search and replace must match.
Class Function ReplaceClasses(const Source, aSearchClasses, aReplaceClasses : String; Normalize : Boolean = false) : String;
Class Function RemoveClasses(const Source, aClasses : String; Normalize : Boolean = false) : String; Class Function RemoveClasses(const Source, aClasses : String; Normalize : Boolean = false) : String;
Class Function RemoveClasses(el : TJSHTMLElement; const aClasses : String; Normalize : Boolean = false) : String; Class Function RemoveClasses(el : TJSHTMLElement; const aClasses : String; Normalize : Boolean = false) : String;
Class Function AddClasses(const Source, aClasses : String; Normalize : Boolean = false) : String; Class Function AddClasses(const Source, aClasses : String; Normalize : Boolean = false) : String;
Class Function AddClasses(el : TJSHTMLElement; const aClasses : String; Normalize : Boolean = false) : String; Class Function AddClasses(el : TJSHTMLElement; const aClasses : String; Normalize : Boolean = false) : String;
Class Function AddRemoveClasses(el : TJSHTMLElement; const aAddClasses, aRemoveClasses : String; Normalize : Boolean = false) : String;
// Number of classes in search and replace must match.
Class Function ReplaceClasses(el : TJSHTMLElement; const aSearchClasses, aReplaceClasses : String; Normalize : Boolean = false) : String;
// Manipulate styles // Manipulate styles
function EnsureStyle(const aName: String): TStyleItem; function EnsureStyle(const aName: String): TStyleItem;
function AddStyle(const aName,aValue: String): TStyleItem; function AddStyle(const aName,aValue: String): TStyleItem;
@ -469,7 +475,11 @@ Type
Procedure Refresh; Procedure Refresh;
// Unrender // Unrender
Procedure Unrender; overload; Procedure Unrender; overload;
// Focus
Procedure Focus;
// These work on the classes property, and on the current element if rendered. Returns the new value of classes. // These work on the classes property, and on the current element if rendered. Returns the new value of classes.
Function AddRemoveClasses(const aAddClasses, aRemoveClasses : String; Normalize : Boolean = false) : String;
Function ReplaceClasses(const aSearchClasses, aReplaceClasses : String; Normalize : Boolean = false) : String;
Function RemoveClasses(const aClasses : String; Normalize : Boolean = false) : String; Function RemoveClasses(const aClasses : String; Normalize : Boolean = false) : String;
Function AddClasses(const aClasses : String; Normalize : Boolean = false) : String; Function AddClasses(const aClasses : String; Normalize : Boolean = false) : String;
// Finding widgets // Finding widgets
@ -2755,6 +2765,14 @@ begin
UnRender(P); UnRender(P);
end; end;
procedure TCustomWebWidget.Focus;
begin
if not IsRendered then
ReFresh;
Element.Focus;
end;
procedure TCustomWebWidget.ApplyWidgetSettings(aElement: TJSHTMLElement); procedure TCustomWebWidget.ApplyWidgetSettings(aElement: TJSHTMLElement);
// Normally, this should be called BEFORE FElement is set. // Normally, this should be called BEFORE FElement is set.
@ -2950,8 +2968,8 @@ begin
Result:=True; Result:=True;
end; end;
class function TCustomWebWidget.RemoveClasses(const Source, aClasses: String; Normalize : Boolean = false): String; class function TCustomWebWidget.AddRemoveClasses(const Source, aAddClasses,
aRemoveClasses: String; Normalize: Boolean): String;
var var
T : TJSStringDynArray; T : TJSStringDynArray;
i : integer; i : integer;
@ -2961,16 +2979,63 @@ begin
if Normalize then if Normalize then
Result:=TJSString(Result).replace(TJSRegexp.New('\s\s+','g'),' '); Result:=TJSString(Result).replace(TJSRegexp.New('\s\s+','g'),' ');
T:=TJSString(Result).split(' '); T:=TJSString(Result).split(' ');
For S in TJSString(aClasses).split(' ') do For S in TJSString(aRemoveClasses).split(' ') do
if (S<>'') then if (S<>'') then
begin begin
I:=TJSArray(T).indexOf(S); I:=TJSArray(T).indexOf(S);
if (I<>-1) then if (I<>-1) then
TJSArray(T).splice(i,1); TJSArray(T).splice(i,1);
end; end;
For S in TJSString(aAddClasses).split(' ') do
if (S<>'') then
begin
I:=TJSArray(T).indexOf(S);
if (I=-1) then
TJSArray(T).Push(S);
end;
Result:=TJSArray(T).join(' '); Result:=TJSArray(T).join(' ');
end; end;
class function TCustomWebWidget.ReplaceClasses(const Source, aSearchClasses, aReplaceClasses : String; Normalize: Boolean): String;
var
Dest,Srch,Repl : TJSStringDynArray;
sIdx,I : integer;
S : String;
begin
Srch:=TJSString(aSearchClasses).split(' ');
Repl:=TJSString(aReplaceClasses).split(' ');
Result:=Source;
if Normalize then
Result:=TJSString(Result).replace(TJSRegexp.New('\s\s+','g'),' ');
Dest:=TJSString(Result).split(' ');
For sIdx:=0 to length(Srch)-1 do
begin
S:=Srch[sIdx];
if (S<>'') then
begin
I:=TJSArray(Dest).indexOf(S);
if (I<>-1) then
begin
TJSArray(Dest).splice(i,1);
if sIdx<Length(Repl) then
begin
I:=TJSArray(Dest).indexOf(Repl[sIdx]);
if I=-1 then
TJSArray(Dest).Push(Repl[sIdx]);
end;
end;
end;
end;
Result:=TJSArray(Dest).join(' ');
end;
class function TCustomWebWidget.RemoveClasses(const Source, aClasses: String; Normalize : Boolean = false): String;
begin
Result:=AddRemoveClasses(Source,'',aClasses,Normalize);
end;
class function TCustomWebWidget.RemoveClasses(el: TJSHTMLElement; const aClasses: String; Normalize : Boolean = false): String; class function TCustomWebWidget.RemoveClasses(el: TJSHTMLElement; const aClasses: String; Normalize : Boolean = false): String;
begin begin
@ -2980,23 +3045,8 @@ end;
class function TCustomWebWidget.AddClasses(const Source, aClasses: String; Normalize : Boolean = false): String; class function TCustomWebWidget.AddClasses(const Source, aClasses: String; Normalize : Boolean = false): String;
var
T : TJSStringDynArray;
S : String;
begin begin
Result:=Source; Result:=AddRemoveClasses(Source,aClasses,'',Normalize);
if Normalize then
Result:=TJSString(Result).replace(TJSRegexp.New('\s\s+','g'),' ');
if AClasses='' then exit;
T:=TJSString(Result).split(' ');
For S in TJSString(aClasses).split(' ') do
if (S<>'') then
begin
if (TJSArray(T).indexOf(S)=-1) then
TJSArray(T).Push(S);
end;
Result:=TJSArray(T).Join(' ');
end; end;
class function TCustomWebWidget.AddClasses(el: TJSHTMLElement; const aClasses: String; Normalize : Boolean = false): String; class function TCustomWebWidget.AddClasses(el: TJSHTMLElement; const aClasses: String; Normalize : Boolean = false): String;
@ -3006,6 +3056,38 @@ begin
el.ClassName:=Trim(Result); el.ClassName:=Trim(Result);
end; end;
class function TCustomWebWidget.AddRemoveClasses(el: TJSHTMLElement;
const aAddClasses, aRemoveClasses: String; Normalize: Boolean): String;
begin
Result:=AddRemoveClasses(el.ClassName,aAddClasses,aRemoveClasses,Normalize);
el.ClassName:=Trim(Result);
end;
class function TCustomWebWidget.ReplaceClasses(el: TJSHTMLElement;
const aSearchClasses, aReplaceClasses: String; Normalize: Boolean): String;
begin
Result:=ReplaceClasses(el.ClassName,aSearchClasses, aReplaceClasses,Normalize);
el.ClassName:=Trim(Result);
end;
function TCustomWebWidget.AddRemoveClasses(const aAddClasses,
aRemoveClasses: String; Normalize: Boolean): String;
begin
FClasses:=AddRemoveClasses(FClasses,aAddClasses,aRemoveClasses,Normalize);
Result:=FClasses;
if IsRendered then
Result:=AddRemoveClasses(FElement,aAddClasses,aRemoveClasses,Normalize)
end;
function TCustomWebWidget.ReplaceClasses(const aSearchClasses,
aReplaceClasses: String; Normalize: Boolean): String;
begin
FClasses:=ReplaceClasses(FClasses,aSearchClasses,aReplaceClasses,Normalize);
Result:=FClasses;
if IsRendered then
Result:=ReplaceClasses(FElement,aSearchClasses,aReplaceClasses,Normalize)
end;
function TCustomWebWidget.RemoveClasses(const aClasses: String; Normalize : Boolean = false): String; function TCustomWebWidget.RemoveClasses(const aClasses: String; Normalize : Boolean = false): String;
begin begin
FClasses:=RemoveClasses(FClasses,aClasses,Normalize); FClasses:=RemoveClasses(FClasses,aClasses,Normalize);