diff --git a/components/spktoolbar/SpkToolbar/SpkToolbar.pas b/components/spktoolbar/SpkToolbar/SpkToolbar.pas
index aedb23dae..37340a352 100644
--- a/components/spktoolbar/SpkToolbar/SpkToolbar.pas
+++ b/components/spktoolbar/SpkToolbar/SpkToolbar.pas
@@ -50,6 +50,9 @@ type /// Typ opisuj¹cy regiony toolbara, które s¹ u¿ywane podczas
/// obs³ugi interakcji z mysz¹
TSpkMouseToolbarElement = (teNone, teToolbarArea, teTabs, teTabContents);
+ TSpkTabChangingEvent = procedure (Sender: TObject; OldIndex, NewIndex: Integer;
+ var Allowed: Boolean) of object;
+
type TSpkToolbar = class;
/// Klasa dyspozytora s³u¿¹ca do bezpiecznego przyjmowania
@@ -96,6 +99,9 @@ type TSpkToolbar = class;
/// Rozszerzony pasek narzêdzi inspirowany Microsoft Fluent
/// UI
+
+ { TSpkToolbar }
+
TSpkToolbar = class(TCustomControl)
private
/// Instancja obiektu dyspozytora przekazywanego elementom
@@ -141,7 +147,7 @@ type TSpkToolbar = class;
/// komponentu. FUpdating jest sterowana przez u¿ytkownika.
FUpdating : boolean;
- FOnTabChanging: TNotifyEvent;
+ FOnTabChanging: TSpkTabChangingEvent;
FOnTabChanged: TNotifyEvent;
protected
@@ -165,6 +171,7 @@ type TSpkToolbar = class;
///
FDisabledLargeImages : TImageList;
+ function DoTabChanging(OldIndex, NewIndex: Integer): Boolean;
// *******************************************
// *** Zarz¹dzanie stanem metryki i bufora ***
// *******************************************
@@ -359,7 +366,7 @@ type TSpkToolbar = class;
property DisabledLargeImages : TImageList read FDisabledLargeImages write SetDisabledLargeImages;
// Events called before and after a different tab is selected
- property OnTabChanging: TNotifyEvent read FOnTabChanging write FOnTabChanging;
+ property OnTabChanging: TSpkTabChangingEvent read FOnTabChanging write FOnTabChanging;
property OnTabChanged: TNotifyEvent read FOnTabChanged write FOnTabChanged;
end;
@@ -885,9 +892,10 @@ begin
end;
procedure TSpkToolbar.NotifyItemsChanged;
+var
+ OldTabIndex: Integer;
begin
- if Assigned(FOnTabChanging) then FOnTabChanging(self);
-
+ OldTabIndex := FTabIndex;
// Poprawianie TabIndex o ile zachodzi taka potrzeba
if not(AtLeastOneTabVisible) then FTabIndex:=-1
else
@@ -901,12 +909,16 @@ begin
end;
FTabHover:=-1;
- SetMetricsInvalid;
+ if DoTabChanging(OldTabIndex, FTabIndex) then begin
+ SetMetricsInvalid;
- if not(FInternalUpdating or FUpdating) then
- Repaint;
+ if not(FInternalUpdating or FUpdating) then
+ Repaint;
+
+ if Assigned(FOnTabChanged) then FOnTabChanged(self);
+ end else
+ FTabIndex := OldTabIndex;
- if Assigned(FOnTabChanged) then FOnTabChanged(self);
end;
procedure TSpkToolbar.NotifyVisualsChanged;
@@ -1001,6 +1013,13 @@ begin
Repaint;
end;
+function TSpkToolbar.DoTabChanging(OldIndex, NewIndex: Integer): Boolean;
+begin
+ Result := True;
+ if Assigned(FOnTabChanging) then
+ FOnTabChanging(Self, OldIndex, NewIndex, Result);
+end;
+
procedure TSpkToolbar.SetMetricsInvalid;
begin
FMetricsValid:=false;
@@ -1008,8 +1027,10 @@ FBufferValid:=false;
end;
procedure TSpkToolbar.SetTabIndex(const Value: integer);
+var
+ OldTabIndex: Integer;
begin
- if Assigned(FOnTabChanging) then FOnTabChanging(self);
+ OldTabIndex := FTabIndex;
if not(AtLeastOneTabVisible) then FTabIndex:=-1
else
@@ -1023,12 +1044,13 @@ begin
end;
FTabHover:=-1;
- SetMetricsInvalid;
-
- if not(FInternalUpdating or FUpdating) then
- Repaint;
-
- if Assigned(FOnTabChanged) then FOnTabChanged(self);
+ if DoTabChanging(OldTabIndex, FTabIndex) then begin
+ SetMetricsInvalid;
+ if not(FInternalUpdating or FUpdating) then
+ Repaint;
+ if Assigned(FOnTabChanged) then FOnTabChanged(self);
+ end else
+ FTabIndex := OldTabIndex;
end;
procedure TSpkToolbar.TabMouseDown(Button: TMouseButton; Shift: TShiftState; X,
@@ -1061,11 +1083,12 @@ if AtLeastOneTabVisible then
// zmieñ zaznaczenie.
if (Button = mbLeft) and (SelTab<>-1) and (SelTab<>FTabIndex) then
begin
- if Assigned(FOnTabChanging) then FOnTabChanging(self);
- FTabIndex:=SelTab;
- SetMetricsInvalid;
- Repaint;
- if Assigned(FOnTabChanged) then FOnTabChanged(self);
+ if DoTabChanging(FTabIndex, SelTab) then begin
+ FTabIndex:=SelTab;
+ SetMetricsInvalid;
+ Repaint;
+ if Assigned(FOnTabChanged) then FOnTabChanged(self);
+ end;
end;
end;