Browse Source

* Add Focus and ReplaceClasses/AddRemoveClasses

michael 4 years ago
parent
commit
1308f6be51
1 changed files with 101 additions and 19 deletions
  1. 101 19
      packages/webwidget/webwidget.pas

+ 101 - 19
packages/webwidget/webwidget.pas

@@ -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,42 +2979,74 @@ 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.RemoveClasses(el: TJSHTMLElement; const aClasses: String; Normalize : Boolean = false): String;
-
-begin
-  Result:=RemoveClasses(el.ClassName,aClasses,Normalize);
-  el.ClassName:=Result;
-end;
-
-class function TCustomWebWidget.AddClasses(const Source, aClasses: String; Normalize : Boolean = false): String;
-
+class function TCustomWebWidget.ReplaceClasses(const Source, aSearchClasses, aReplaceClasses : String; Normalize: Boolean): String;
 var
 var
-  T : TJSStringDynArray;
+  Dest,Srch,Repl : TJSStringDynArray;
+  sIdx,I : integer;
   S : String;
   S : String;
 
 
 begin
 begin
+  Srch:=TJSString(aSearchClasses).split(' ');
+  Repl:=TJSString(aReplaceClasses).split(' ');
   Result:=Source;
   Result:=Source;
   if Normalize then
   if Normalize then
     Result:=TJSString(Result).replace(TJSRegexp.New('\s\s+','g'),' ');
     Result:=TJSString(Result).replace(TJSRegexp.New('\s\s+','g'),' ');
-  if AClasses='' then exit;
-  T:=TJSString(Result).split(' ');
-  For S in TJSString(aClasses).split(' ') do
+  Dest:=TJSString(Result).split(' ');
+  For sIdx:=0 to length(Srch)-1 do
+    begin
+    S:=Srch[sIdx];
     if (S<>'') then
     if (S<>'') then
       begin
       begin
-      if (TJSArray(T).indexOf(S)=-1) then
-        TJSArray(T).Push(S);
+      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(T).Join(' ');
+    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;
+
+begin
+  Result:=RemoveClasses(el.ClassName,aClasses,Normalize);
+  el.ClassName:=Result;
+end;
+
+class function TCustomWebWidget.AddClasses(const Source, aClasses: String; Normalize : Boolean = false): String;
+
+begin
+  Result:=AddRemoveClasses(Source,aClasses,'',Normalize);
 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);