@@ -1088,7 +1088,7 @@ procedure TfrmTableTools.editDatabaseTableFilterChange(Sender: TObject);
10881088 Node: PVirtualNode;
10891089 Obj: PDBObject;
10901090 rxdb, rxtable: TRegExpr;
1091- NodeMatches: Boolean;
1091+ NodeMatches, SomeHidden : Boolean;
10921092 Errors: TStringList;
10931093begin
10941094 // Immediately apply database filter
@@ -1102,6 +1102,7 @@ procedure TfrmTableTools.editDatabaseTableFilterChange(Sender: TObject);
11021102 rxtable.Expression := ' (' +StringReplace(editTableFilter.Text, ' ;' , ' |' , [rfReplaceAll])+' )' ;
11031103
11041104 Errors := TStringList.Create;
1105+ SomeHidden := False;
11051106
11061107 TreeObjects.BeginUpdate;
11071108 Node := TreeObjects.GetFirst;
@@ -1135,6 +1136,8 @@ procedure TfrmTableTools.editDatabaseTableFilterChange(Sender: TObject);
11351136 end ;
11361137 end ;
11371138 TreeObjects.IsVisible[Node] := NodeMatches;
1139+ if not NodeMatches then
1140+ SomeHidden := True;
11381141
11391142 Node := TreeObjects.GetNextInitialized(Node);
11401143 end ;
@@ -1145,6 +1148,10 @@ procedure TfrmTableTools.editDatabaseTableFilterChange(Sender: TObject);
11451148
11461149 editDatabaseFilter.RightButton.Visible := editDatabaseFilter.Text <> ' ' ;
11471150 editTableFilter.RightButton.Visible := editTableFilter.Text <> ' ' ;
1151+ if SomeHidden then
1152+ menuCheckAll.Caption := _(' Check all visible' )
1153+ else
1154+ menuCheckAll.Caption := _(' Check all' );
11481155 timerCalcSize.Enabled := False;
11491156 timerCalcSize.Enabled := True;
11501157end ;
@@ -2512,7 +2519,7 @@ procedure TfrmTableTools.CheckAllClick(Sender: TObject);
25122519 DBNode, ObjNode: PVirtualNode;
25132520 WantedType: TListNodeType;
25142521 DBObj: PDBObject;
2515- CheckNone: Boolean;
2522+ CheckNone, DoCheck : Boolean;
25162523 InvertCheck: Boolean;
25172524 CheckedNodes: Int64;
25182525begin
@@ -2530,25 +2537,29 @@ procedure TfrmTableTools.CheckAllClick(Sender: TObject);
25302537 CheckedNodes := 0 ;
25312538 while Assigned(ObjNode) do begin
25322539 DBObj := TreeObjects.GetNodeData(ObjNode);
2540+
25332541 if CheckNone then
2534- TreeObjects.CheckState[ObjNode] := csUncheckedNormal
2535- else if InvertCheck then begin
2536- if ObjNode.CheckState in CheckedStates then
2537- TreeObjects.CheckState[ObjNode] := csUncheckedNormal
2538- else
2539- TreeObjects.CheckState[ObjNode] := csCheckedNormal;
2542+ DoCheck := False
2543+ else if not TreeObjects.IsVisible[ObjNode] then
2544+ DoCheck := False
2545+ else if InvertCheck then
2546+ DoCheck := not (ObjNode.CheckState in CheckedStates)
2547+ else
2548+ DoCheck := (WantedType = lntNone) or (DBObj.NodeType = WantedType) or (DBObj.GroupType = WantedType);
2549+
2550+ if DoCheck then begin
2551+ TreeObjects.CheckState[ObjNode] := csCheckedNormal;
2552+ Inc(CheckedNodes);
25402553 end
25412554 else begin
2542- if (WantedType = lntNone) or (DBObj.NodeType = WantedType) or (DBObj.GroupType = WantedType) then
2543- TreeObjects.CheckState[ObjNode] := csCheckedNormal
2544- else
2545- TreeObjects.CheckState[ObjNode] := csUncheckedNormal;
2555+ TreeObjects.CheckState[ObjNode] := csUncheckedNormal;
25462556 end ;
2547- if ObjNode.CheckState = csCheckedNormal then
2548- Inc(CheckedNodes);
2557+
25492558 TreeObjects.RepaintNode(ObjNode);
25502559 ObjNode := TreeObjects.GetNextSibling(ObjNode);
25512560 end ;
2561+
2562+ // Update parent node's checkbox
25522563 if CheckedNodes = 0 then
25532564 TreeObjects.CheckState[DBNode] := csUncheckedNormal
25542565 else if CheckedNodes = TreeObjects.ChildCount[DBNode] then
0 commit comments