📄 dxribbongrouplayoutcalculator.pas
字号:
(AItemControlIndex > 0) and not IsNewColumnItemControl(AItemControlViewInfo);
end;
end;
function IsWholeGroupHeightItemControl(
AItemControlViewInfo: IdxBarItemControlViewInfo): Boolean; overload;
var
AMultiColumnItemControlViewInfo: IdxBarMultiColumnItemControlViewInfo;
begin
Result := AItemControlViewInfo.IsMultiColumnItemControl(True, AMultiColumnItemControlViewInfo) or
(AItemControlViewInfo.GetViewLevel = ivlLargeIconWithText);
end;
function IsWholeGroupHeightItemControl(AGroupViewInfo: IdxRibbonGroupViewInfo;
AItemControlIndex: Integer): Boolean; overload;
begin
Result := IsWholeGroupHeightItemControl(
AGroupViewInfo.GetItemControlViewInfo(AItemControlIndex));
end;
function IsWholeGroupHeightOnlyItemControl(
AItemControlViewInfo: IdxBarItemControlViewInfo): Boolean; overload;
var
AMultiColumnItemControlViewInfo: IdxBarMultiColumnItemControlViewInfo;
begin
Result := AItemControlViewInfo.IsMultiColumnItemControl(True, AMultiColumnItemControlViewInfo) or
(AItemControlViewInfo.GetAllowedViewLevels = [ivlLargeIconWithText]);
end;
function IsWholeGroupHeightOnlyItemControl(AGroupViewInfo: IdxRibbonGroupViewInfo;
AItemControlIndex: Integer): Boolean; overload;
begin
Result := IsWholeGroupHeightOnlyItemControl(AGroupViewInfo.GetItemControlViewInfo(AItemControlIndex));
end;
function SkipHorizontalBox(AGroupViewInfo: IdxRibbonGroupViewInfo;
var AFirstIndex: Integer; out AIsWholeGroupHeightBox: Boolean): Boolean;
begin
Result := IsPartOfHorizontalBox(AGroupViewInfo, AFirstIndex, True);
if Result then
begin
AIsWholeGroupHeightBox := False;
repeat
AIsWholeGroupHeightBox := AIsWholeGroupHeightBox or
IsWholeGroupHeightItemControl(AGroupViewInfo, AFirstIndex);
Inc(AFirstIndex);
until (AFirstIndex >= AGroupViewInfo.GetItemControlCount) or
not IsPartOfHorizontalBox(AGroupViewInfo, AFirstIndex, False);
end;
end;
{ TdxRibbonGroupLayoutCalculator }
constructor TdxRibbonGroupLayoutCalculator.Create(
AGroupRowHeight, AGroupRowCount: Integer);
begin
inherited Create;
FGroupRowCount := AGroupRowCount;
FGroupRowHeight := AGroupRowHeight;
end;
// IdxRibbonGroupLayoutCalculator
procedure TdxRibbonGroupLayoutCalculator.CalcInit(
AGroupViewInfo: IdxRibbonGroupViewInfo);
var
AItemControlViewInfo: IdxBarItemControlViewInfo;
AItemControlViewInfos: TList;
AMultiColumnItemControlViewInfo: IdxBarMultiColumnItemControlViewInfo;
I: Integer;
begin
AItemControlViewInfos := TList.Create;
try
for I := 0 to AGroupViewInfo.GetItemControlCount - 1 do
AItemControlViewInfos.Add(Pointer(AGroupViewInfo.GetItemControlViewInfo(I)));
CalcItemControlsRealPositionInButtonGroup(AItemControlViewInfos);
finally
AItemControlViewInfos.Free;
end;
for I := 0 to AGroupViewInfo.GetItemControlCount - 1 do
begin
AItemControlViewInfo := AGroupViewInfo.GetItemControlViewInfo(I);
AItemControlViewInfo.SetBounds(cxEmptyRect);
if AItemControlViewInfo.GetRealPositionInButtonGroup = bgrpNone then
AItemControlViewInfo.SetViewLevel(GetMaxViewLevel(AItemControlViewInfo.GetAllowedViewLevels))
else
AItemControlViewInfo.SetViewLevel(AItemControlViewInfo.GetViewLevelForButtonGroup);
if AItemControlViewInfo.IsMultiColumnItemControl(False, AMultiColumnItemControlViewInfo) then
begin
AMultiColumnItemControlViewInfo.SetCollapsed(False);
AMultiColumnItemControlViewInfo.SetColumnCount(AMultiColumnItemControlViewInfo.GetMaxColumnCount);
end;
end;
end;
procedure TdxRibbonGroupLayoutCalculator.CalcLayout(
AGroupViewInfo: IdxRibbonGroupViewInfo);
procedure CheckGroupMinContentWidth;
var
AMinContentWidth: Integer;
begin
AMinContentWidth := AGroupViewInfo.GetMinContentWidth;
if AMinContentWidth < dxRibbonGroupMinContentWidth then
AMinContentWidth := dxRibbonGroupMinContentWidth;
if X < AMinContentWidth then
begin
if X <> 0 then
OffsetContent(AGroupViewInfo, 0, AGroupViewInfo.GetItemControlCount - 1,
(AMinContentWidth - X) div 2);
X := AMinContentWidth;
end;
end;
procedure CalcLayoutFinalize;
var
I: Integer;
begin
for I := 0 to AGroupViewInfo.GetItemControlCount - 1 do
AGroupViewInfo.GetItemControlViewInfo(I).CalculateFinalize;
end;
var
AItemControlViewInfo: IdxBarItemControlViewInfo;
I, J: Integer;
begin
AGroupViewInfo.DeleteSeparators;
FColumnCount := -1;
X := 0;
SetLength(FItemControlColumns, AGroupViewInfo.GetItemControlCount);
SetLength(FItemControlSeparators, AGroupViewInfo.GetItemControlCount);
for I := 0 to High(FItemControlSeparators) do
FItemControlSeparators[I] := -1;
I := 0;
while I < AGroupViewInfo.GetItemControlCount do
begin
J := I;
while J < AGroupViewInfo.GetItemControlCount do
begin
AItemControlViewInfo := AGroupViewInfo.GetItemControlViewInfo(J);
if IsWholeGroupHeightItemControl(AItemControlViewInfo) or
(J > I) and IsNewColumnItemControl(AItemControlViewInfo) then
Break;
Inc(J);
end;
if I < J then
begin
IncrementColumnCount(AGroupViewInfo, I - 1);
PlaceOneRowHeightItemControls(AGroupViewInfo, I, J - 1, True);
end;
I := J;
while (I < AGroupViewInfo.GetItemControlCount) and
IsWholeGroupHeightItemControl(AGroupViewInfo.GetItemControlViewInfo(I)) do
begin
IncrementColumnCount(AGroupViewInfo, I - 1);
PlaceWholeGroupHeightItemControl(AGroupViewInfo, I);
Inc(I);
end;
end;
CheckDistanceBetweenTwoLastColumns(AGroupViewInfo, AGroupViewInfo.GetItemControlCount - 1);
with AGroupViewInfo.GetOffsetsInfo do
begin
OffsetContent(AGroupViewInfo, 0, AGroupViewInfo.GetItemControlCount - 1, ContentLeftOffset);
Inc(X, ContentLeftOffset + ContentRightOffset);
end;
CheckGroupMinContentWidth;
AGroupViewInfo.SetContentSize(Size(X, GetGroupHeight));
CalcLayoutFinalize;
end;
function TdxRibbonGroupLayoutCalculator.CollapseMultiColumnItemControls(
AGroupViewInfo: IdxRibbonGroupViewInfo): Boolean;
var
AItemControlViewInfo: IdxBarItemControlViewInfo;
AMultiColumnItemControlViewInfo: IdxBarMultiColumnItemControlViewInfo;
I: Integer;
begin
Result := False;
if AGroupViewInfo.GetItemControlCount = 0 then
Exit;
for I := AGroupViewInfo.GetItemControlCount - 1 downto 0 do
begin
AItemControlViewInfo := AGroupViewInfo.GetItemControlViewInfo(I);
if AItemControlViewInfo.IsMultiColumnItemControl(True, AMultiColumnItemControlViewInfo) and
AMultiColumnItemControlViewInfo.CanCollapse then
begin
Result := True;
AMultiColumnItemControlViewInfo.SetCollapsed(True);
Break;
end;
end;
if Result then
CalcLayout(AGroupViewInfo);
end;
function TdxRibbonGroupLayoutCalculator.DecreaseMultiColumnItemControlsColumnCount(
AGroupViewInfo: IdxRibbonGroupViewInfo): Boolean;
var
AItemControlViewInfo: IdxBarItemControlViewInfo;
AMultiColumnItemControlViewInfo: IdxBarMultiColumnItemControlViewInfo;
I: Integer;
begin
Result := False;
if AGroupViewInfo.GetItemControlCount = 0 then
Exit;
for I := AGroupViewInfo.GetItemControlCount - 1 downto 0 do
begin
AItemControlViewInfo := AGroupViewInfo.GetItemControlViewInfo(I);
if AItemControlViewInfo.IsMultiColumnItemControl(True, AMultiColumnItemControlViewInfo) and
(AMultiColumnItemControlViewInfo.GetColumnCount > AMultiColumnItemControlViewInfo.GetMinColumnCount) then
begin
Result := True;
AMultiColumnItemControlViewInfo.SetColumnCount(AMultiColumnItemControlViewInfo.GetColumnCount - 1);
Break;
end;
end;
if Result then
CalcLayout(AGroupViewInfo);
end;
function TdxRibbonGroupLayoutCalculator.Reduce(
AGroupViewInfo: IdxRibbonGroupViewInfo; AUpToViewLevel: TdxBarItemRealViewLevel): Boolean;
begin
if AGroupViewInfo.GetItemControlCount = 0 then
Result := False
else
if Pred(AUpToViewLevel) = ivlLargeIconWithText then
Result := ReduceWholeGroupHeightItemControls(AGroupViewInfo)
else
begin
Result := ReduceOneRowHeightItemControlsWithText(AGroupViewInfo, AUpToViewLevel);
if not Result then
FItemControlIndexForOneRowHeightReducing := AGroupViewInfo.GetItemControlCount - 1;
end;
end;
procedure TdxRibbonGroupLayoutCalculator.ReduceInit(
AGroupViewInfo: IdxRibbonGroupViewInfo);
var
AIndex, ASequenceCount: Integer;
begin
ASequenceCount := 0;
AIndex := 0;
repeat
SetLength(FSequencesForWholeGroupHeightReducing, ASequenceCount + 1);
FindSequenceForWholeGroupHeightReducing(AGroupViewInfo, AIndex,
FSequencesForWholeGroupHeightReducing[ASequenceCount]);
if Length(FSequencesForWholeGroupHeightReducing[ASequenceCount]) = 0 then
begin
SetLength(FSequencesForWholeGroupHeightReducing, ASequenceCount);
Break;
end;
Inc(ASequenceCount);
until False;
FLastSequenceForWholeGroupHeightReducing := ASequenceCount - 1;
FItemControlIndexForOneRowHeightReducing := AGroupViewInfo.GetItemControlCount - 1;
end;
procedure TdxRibbonGroupLayoutCalculator.AlignOneRowHeightItemControl(
AItemControlViewInfo: IdxBarItemControlViewInfo; AColumnWidth: Integer);
var
R: TRect;
begin
R := AItemControlViewInfo.GetBounds;
case AItemControlViewInfo.GetAlign of
iaCenter:
OffsetRect(R, (AColumnWidth - cxRectWidth(R)) div 2, 0);
iaRight:
OffsetRect(R, AColumnWidth - cxRectWidth(R), 0);
iaClient:
R.Right := R.Left + AColumnWidth;
end;
AItemControlViewInfo.SetBounds(R);
end;
procedure TdxRibbonGroupLayoutCalculator.AlignOneRowHeightItemControls(
AGroupViewInfo: IdxRibbonGroupViewInfo; AFirstIndex, AColumnWidth: Integer);
function SkipRowWithSeveralItemControls: Boolean;
var
AColumn, ARow: Integer;
begin
Result := False;
AColumn := FItemControlColumns[AFirstIndex];
ARow := AGroupViewInfo.GetItemControlViewInfo(AFirstIndex).GetRow;
while (AFirstIndex + 1 < AGroupViewInfo.GetItemControlCount) and
(FItemControlColumns[AFirstIndex + 1] = AColumn) and
(AGroupViewInfo.GetItemControlViewInfo(AFirstIndex + 1).GetRow = ARow) do
begin
Result := True;
Inc(AFirstIndex);
end;
if Result then
Inc(AFirstIndex);
end;
var
AColumn: Integer;
begin
AColumn := FItemControlColumns[AFirstIndex];
while (AFirstIndex < AGroupViewInfo.GetItemControlCount) and
(FItemControlColumns[AFirstIndex] = AColumn) do
begin
if SkipRowWithSeveralItemControls then // TODO by first ItemControl
Continue;
AlignOneRowHeightItemControl(AGroupViewInfo.GetItemControlViewInfo(AFirstIndex), AColumnWidth);
Inc(AFirstIndex);
end;
end;
procedure TdxRibbonGroupLayoutCalculator.CheckDistanceBetweenTwoLastColumns(
AGroupViewInfo: IdxRibbonGroupViewInfo; ALastItemControlIndex: Integer);
function GetColumnFirstItemControlIndex(AColumnLastItemControlIndex: Integer): Integer;
var
AColumn: Integer;
begin
AColumn := FItemControlColumns[AColumnLastItemControlIndex];
Result := AColumnLastItemControlIndex;
while (Result > 0) and (FItemControlColumns[Result - 1] = AColumn) do
Dec(Result);
end;
procedure GetMaxBoundInfoForItemControls(
AFirstItemControlIndex, ALastItemControlIndex: Integer;
out AMaxRightBound, AMaxButtonGroupRightBound: Integer);
var
AItemControlViewInfo: IdxBarItemControlViewInfo;
I: Integer;
R: TRect;
begin
AMaxRightBound := -1;
AMaxButtonGroupRightBound := -1;
for I := AFirstItemControlIndex to ALastItemControlIndex do
begin
AItemControlViewInfo := AGroupViewInfo.GetItemControlViewInfo(I);
R := AItemControlViewInfo.GetBounds;
AMaxRightBound := Max(AMaxRightBound, R.Right);
if AItemControlViewInfo.GetRealPositionInButtonGroup in [bgrpFinish, bgrpSingle] then
AMaxButtonGroupRightBound := Max(AMaxButtonGroupRightBound, R.Right);
end;
end;
procedure GetMinBoundInfoForItemControls(
AFirstItemControlIndex, ALastItemControlIndex: Integer;
out AMinLeftBound, AMinButtonGroupLeftBound: Integer);
var
AItemControlViewInfo: IdxBarItemControlViewInfo;
I: Integer;
begin
AMinLeftBound := AGroupViewInfo.GetItemControlViewInfo(AFirstItemControlIndex).GetBounds.Left;
AMinButtonGroupLeftBound := MaxInt;
for I := AFirstItemControlIndex to ALastItemControlIndex do
begin
AItemControlViewInfo := AGroupViewInfo.GetItemControlViewInfo(I);
if AItemControlViewInfo.GetRealPositionInButtonGroup in [bgrpStart, bgrpSingle] then
AMinButtonGroupLeftBound := Min(AMinButtonGroupLeftBound,
AItemControlViewInfo.GetBounds.Left);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -