⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxribbongrouplayoutcalculator.pas

📁 胜天进销存源码,国产优秀的进销存
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      (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 + -