cxcustomtablevieweditor.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,118 行 · 第 1/3 页

PAS
1,118
字号
      View.BeginUpdate;
      try
        ListBoxDeleteSelection(AListBox, True);
        ListBoxLoadCollection(AListBox, ACollection);
      finally
        View.EndUpdate;
      end;
      FormEditor.ListBoxApplySelection(AListBox, ACollection);
      UpdateDesigner;
    finally
      EndUpdate;
    end;
  end;
end;

procedure TcxCustomTableViewEditor.DoCreateViewItems(AMissingItemsOnly: Boolean);

  procedure GetViewItems(AItems: TList);
  var
    I: Integer;
  begin
    for I := 0 to View.ItemCount - 1 do
      AItems.Add(View.Items[I]);
  end;

  procedure GetViewNewItems(AOldItems, ANewItems: TList);
  var
    I, J: Integer;
  begin
    for I := 0 to View.ItemCount - 1 do
    begin
      J := AOldItems.IndexOf(View.Items[I]);
      if J = -1 then
        ANewItems.Add(View.Items[I])
      else
        AOldItems.Delete(J);
    end;
  end;

var
  AItems: TList;
begin
  AItems := TList.Create;
  try
    GetViewItems(AItems);
    CreateViewItems(View, AMissingItemsOnly);
    GetViewNewItems(AItems, AItems);
    UpdateColumnList;
    ListBoxSyncSelection(LBColumns, AItems);
    LBColumnsClick(nil);
    UpdateDesigner;
  finally
    AItems.Free;
  end;
end;

procedure TcxCustomTableViewEditor.DrawListBoxItem(AListBox: TWinControl;
  AIndex: Integer; R: TRect);
begin
  with AListBox as TListBox, Canvas do
  begin
    FillRect(R);
    TextOut(R.Left + 2, R.Top, Items[AIndex]);
  end;
end;

function TcxCustomTableViewEditor.GetCurrentGroup: TcxDataSummaryGroup;

  function GetGroupByItems(ASummaryItems: TcxDataSummaryItems): TcxDataSummaryGroup;
  var
    I: Integer;
  begin
    Result := nil;
    for I := 0 to SummaryGroups.Count - 1 do
      if SummaryGroups[I].SummaryItems = ASummaryItems then
      begin
        Result := SummaryGroups[I];
        Break;
      end;
  end;

  function GetGroupByItemLinks(ASummaryGroupItemLinks: TcxDataSummaryGroupItemLinks): TcxDataSummaryGroup;
  var
    I: Integer;
  begin
    Result := nil;
    for I := 0 to SummaryGroups.Count - 1 do
      if SummaryGroups[I].Links = ASummaryGroupItemLinks then
      begin
        Result := SummaryGroups[I];
        Break;
      end;
  end;

  function GetSummaryGroup(APersistent: TPersistent): TcxDataSummaryGroup;
  begin
    if APersistent is TcxDataSummaryGroup then
      Result := TcxDataSummaryGroup(APersistent) 
    else
      if APersistent is TcxDataSummaryItem then
        Result := GetGroupByItems(TcxDataSummaryItem(APersistent).SummaryItems)
      else
        if APersistent is TcxDataSummaryItems then
          Result := GetGroupByItems(TcxDataSummaryItems(APersistent))
        else
          if APersistent is TcxDataSummaryGroupItemLink then
            Result := GetGroupByItemLinks(TcxDataSummaryGroupItemLink(APersistent).SummaryGroupItemLinks)
          else
            if APersistent is TcxDataSummaryGroupItemLinks then
              Result := GetGroupByItemLinks(TcxDataSummaryGroupItemLinks(APersistent))
            else
              Result := nil;
  end;

var
  AList: TList;
  I: Integer;
  ASummaryGroup: TcxDataSummaryGroup;
begin
  Result := nil;
  AList := TList.Create;
  try
    GetSelectionList(AList);
    for I := 0 to AList.Count - 1 do
    begin
      ASummaryGroup := GetSummaryGroup(TPersistent(AList[I]));
      if (ASummaryGroup <> nil) and (GetViewByObject(ASummaryGroup) = View) then
        if Result = nil then
          Result := ASummaryGroup
        else
          if Result <> ASummaryGroup then
          begin
            Result := nil;
            Break;
          end;
    end;
  finally
    AList.Free;
  end;
end;

function TcxCustomTableViewEditor.GetDeleteItemsCaption: string;
begin
  Result := Format('Delete existing %ss?', [LowerCase(GetViewItemName(View))]);
end;

procedure TcxCustomTableViewEditor.SelectAllColumns;
begin
  ListBoxSelectAll(LBColumns);
end;

procedure TcxCustomTableViewEditor.UpdateButtons;
begin
  // Columns
  BColumnAdd.Enabled := CanAddComponent;
  BColumnDelete.Enabled := CanDeleteComponent(nil) and (LBColumns.SelCount > 0);
  BColumnRestore.Enabled := LBColumns.SelCount > 0;
  BColumnMoveUp.Enabled := LBColumns.SelCount > 0;
  BColumnMoveDown.Enabled := LBColumns.SelCount > 0;
  BColumnAddAll.Enabled := CanAddComponent and
    (View.DataController as IcxCustomGridDataController).IsDataLinked;
  BColumnAddMissing.Enabled := BColumnAddAll.Enabled and
    not (View.DataController as IcxCustomGridDataController).HasAllItems;

  MIColumnAdd.Enabled := BColumnAdd.Enabled;
  MIColumnDelete.Enabled := BColumnDelete.Enabled;
  MIColumnRestore.Enabled := BColumnRestore.Enabled;
  MIColumnMoveUp.Enabled := BColumnMoveUp.Enabled;
  MIColumnMoveDown.Enabled := BColumnMoveDown.Enabled;
  MIColumnSelectAll.Enabled := LBColumns.SelCount < LBColumns.Items.Count;

  // Summary
  BAddFooterSummaryItem.Enabled := CanAddComponent;
  BDeleteFooterSummaryItem.Enabled := CanDeleteComponent(nil) and (LBFooterSummary.SelCount > 0);

  BDefaultGroupSummaryAdd.Enabled := CanAddComponent;
  BDefaultGroupSummaryDelete.Enabled := CanDeleteComponent(nil) and (LBDefaultGroupsSummary.SelCount > 0);
  
  BSummaryGroupAdd.Enabled := CanAddComponent;
  BSummaryGroupDelete.Enabled := CanDeleteComponent(nil) and (LBSummaryGroups.SelCount > 0);
  BGroupSummaryItemAdd.Enabled := CanAddComponent and (GetCurrentGroup <> nil);
  BGroupSummaryItemDelete.Enabled := CanDeleteComponent(nil) and (LBGroupSummaryItems.SelCount > 0);
  BColumnLink.Enabled := CanAddComponent and (LBUnlinkedColumns.SelCount > 0);
  BColumnUnlink.Enabled := CanDeleteComponent(nil) and (LBLinkedColumns.SelCount > 0);

  MIFooterSummaryAdd.Enabled := BAddFooterSummaryItem.Enabled;
  MIFooterSummaryDelete.Enabled := BDeleteFooterSummaryItem.Enabled;
  MIFooterSummarySelectAll.Enabled := LBFooterSummary.SelCount < LBFooterSummary.Items.Count;

  MIDefaultGroupSummaryAdd.Enabled := BDefaultGroupSummaryAdd.Enabled;
  MIDefaultGroupSummaryDelete.Enabled := BDefaultGroupSummaryDelete.Enabled;
  MIDefaultGroupSummarySelectAll.Enabled := LBDefaultGroupsSummary.SelCount < LBDefaultGroupsSummary.Items.Count;

  MISummaryGroupAdd.Enabled := BSummaryGroupAdd.Enabled;
  MISummaryGroupDelete.Enabled := BSummaryGroupDelete.Enabled;
  MISummaryGroupSelectAll.Enabled := LBSummaryGroups.SelCount < LBSummaryGroups.Items.Count;

  MIGroupSummaryItemsAdd.Enabled := BGroupSummaryItemAdd.Enabled;
  MIGroupSummaryItemsDelete.Enabled := BGroupSummaryItemDelete.Enabled;
  MIGroupSummaryItemsSelectAll.Enabled := LBGroupSummaryItems.SelCount < LBGroupSummaryItems.Items.Count;
end;

procedure TcxCustomTableViewEditor.UpdateColumnList;
var
  I, AItemIndex, ATopIndex: Integer;
  ASelection: TStringList;
  S: string;
begin
  ListBoxSaveSelection(LBColumns, ASelection, AItemIndex, ATopIndex);
  try
    LBColumns.Items.Clear;
    for I := 0 to View.ItemCount - 1 do
    begin
      S := View.Items[I].Name;
      if View.Items[I].RepositoryItem <> nil then
        S := S + ' (' + View.Items[I].RepositoryItem.Name + ')'; // TODO: description
      LBColumns.Items.AddObject(S, View.Items[I]);
    end;
  finally
    ListBoxRestoreSelection(LBColumns, ASelection, AItemIndex, ATopIndex);
  end;
end;

procedure TcxCustomTableViewEditor.UpdateEditor;
begin
  BColumnAddAll.Visible :=
    (View.DataController as IcxCustomGridDataController).SupportsCreateAllItems;
  BColumnAddMissing.Visible := BColumnAddAll.Visible;  
  UpdateColumnList;
  UpdateSummary;
end;

procedure TcxCustomTableViewEditor.UpdateSelection;
begin
  FormEditor.ListBoxSynchronizeSelection(LBColumns);
  UpdateSummarySelection;
  UpdateButtons;
end;

procedure TcxCustomTableViewEditor.UpdateSummary;
begin
  ListBoxLoadCollection(LBFooterSummary, FooterSummaryItems);
  ListBoxLoadCollection(LBDefaultGroupsSummary, DefaultGroupSummaryItems);
  ListBoxLoadCollection(LBSummaryGroups, SummaryGroups);
  UpdateSummaryGroups;
end;

procedure TcxCustomTableViewEditor.UpdateSummarySelection;
var
  AList: TList;
begin
  AList := TList.Create;
  try
    FormEditor.GetSelectionList(AList);
    ListBoxSyncSelection(LBFooterSummary, AList);
    ListBoxSyncSelection(LBDefaultGroupsSummary, AList);
    ListBoxSyncSelection(LBSummaryGroups, AList);
    ListBoxSelectByObject(LBSummaryGroups, GetCurrentGroup);
    SummaryGroup := GetCurrentGroup;  
    ListBoxSyncSelection(LBGroupSummaryItems, AList);
  finally
    AList.Free;
  end;
end;

function TcxCustomTableViewEditor.GetDefaultGroupSummaryItems: TcxDataGroupSummaryItems;
begin
  Result := View.DataController.Summary.DefaultGroupSummaryItems;
end;

function TcxCustomTableViewEditor.GetFooterSummaryItems: TcxDataFooterSummaryItems;
begin
  Result := View.DataController.Summary.FooterSummaryItems;
end;

function TcxCustomTableViewEditor.GetSummaryGroups: TcxDataSummaryGroups;
begin
  Result := View.DataController.Summary.SummaryGroups;
end;

function TcxCustomTableViewEditor.GetView: TcxCustomGridTableView;
begin
  Result := inherited View as TcxCustomGridTableView;
end;

procedure TcxCustomTableViewEditor.SetSummaryGroup(Value: TcxDataSummaryGroup);
begin
  if FSummaryGroup <> Value then
  begin
    FSummaryGroup := Value;
    UpdateSummaryGroups;
  end;
end;

procedure TcxCustomTableViewEditor.ReindexColumnsProc(AList: TList; ANewIndex: Integer);
var
  I: Integer;
begin
  if AList.Count = 0 then Exit;
  if TcxCustomGridTableItem(AList[0]).Index < ANewIndex then
  begin
    for I := 0 to AList.Count - 1 do
      TcxCustomGridTableItem(AList[I]).Index := ANewIndex;
  end
  else
  begin
    for I := AList.Count - 1 downto 0 do
      TcxCustomGridTableItem(AList[I]).Index := ANewIndex;
  end;
  UpdateDesigner;
end;

procedure TcxCustomTableViewEditor.UpdateSummaryGroupLinks;
var
  ACurrentGroup: TcxDataSummaryGroup;
  I: Integer;
  AItemLink: TObject;
  ADataController: TcxCustomDataController;
  AItemIndex1, ATopIndex1, AItemIndex2, ATopIndex2: Integer;
  ASelection1, ASelection2: TStringList;
begin
  ACurrentGroup := GetCurrentGroup;
  ListBoxSaveSelection(LBUnlinkedColumns, ASelection1, AItemIndex1, ATopIndex1);
  ListBoxSaveSelection(LBLinkedColumns, ASelection2, AItemIndex2, ATopIndex2);
  try
    LBUnlinkedColumns.Items.Clear;
    LBLinkedColumns.Items.Clear;
    if ACurrentGroup <> nil then
    begin
      for I := 0 to ACurrentGroup.Links.Count - 1 do
      begin
        AItemLink := ACurrentGroup.Links[I].ItemLink;
        if AItemLink is TComponent then
          LBLinkedColumns.Items.AddObject((AItemLink as TComponent).Name, AItemLink);
      end;
      ADataController := ACurrentGroup.SummaryGroups.Summary.DataController;
      for I := 0 to ADataController.ItemCount - 1 do
      begin
        AItemLink := ADataController.GetItem(I);
        if LBLinkedColumns.Items.IndexOfObject(AItemLink) = -1 then
          LBUnlinkedColumns.Items.AddObject((AItemLink as TComponent).Name, AItemLink);
      end;
    end;
  finally
    ListBoxRestoreSelection(LBUnlinkedColumns, ASelection1, AItemIndex1, ATopIndex1);
    ListBoxRestoreSelection(LBLinkedColumns, ASelection2, AItemIndex2, ATopIndex2);
  end;
end;

procedure TcxCustomTableViewEditor.UpdateSummaryGroups;
var
  ACurrentGroup: TcxDataSummaryGroup;
begin
  ACurrentGroup := GetCurrentGroup;
  if ACurrentGroup <> nil then
    ListBoxLoadCollection(LBGroupSummaryItems, ACurrentGroup.SummaryItems)
  else
    LBGroupSummaryItems.Items.Clear;
  UpdateSummaryGroupLinks;
end;

// Columns

procedure TcxCustomTableViewEditor.LBColumnsClick(Sender: TObject);
begin
  FormEditor.ListBoxApplySelection(LBColumns, View);
end;

procedure TcxCustomTableViewEditor.BColumnAddClick(Sender: TObject);
var
  AItem: TcxCustomGridTableItem;
begin
  ListBoxClearSelection(LBColumns);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?