cxgriddetailssite.pas

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

PAS
2,042
字号
  SiteViewInfo.InitTabHitTest(TcxGridDetailsSiteTabHitTest(AHitTest));
end;

function TcxCustomGridDetailsSiteTabViewInfo.MouseDown(AHitTest: TcxCustomGridHitTest;
  AButton: TMouseButton; AShift: TShiftState): Boolean;
begin
  inherited MouseDown(AHitTest, AButton, AShift);
  if (AButton = mbLeft) and not (ssDouble in AShift) and Grid.IsDesigning then
    TcxCustomGrid(Grid).StructureNavigator.SelectObject(FLevel, not (ssShift in AShift));
  SiteViewInfo.ChangeActiveTab(FLevel, False);
  Result := True;
end;

function TcxCustomGridDetailsSiteTabViewInfo.ProcessDialogChar(ACharCode: Word): Boolean;
begin
  Result := cxGridTabAccelSupport and SiteViewInfo.SupportsTabAccelerators and
    IsAccel(ACharCode, Caption);
  if Result then
    SiteViewInfo.ChangeActiveTab(FLevel, True);
end;

{$ENDIF}

{$IFDEF USETABCONTROL}

{ TcxGridTabControl }

constructor TcxGridLevelTabControl.Create(ASiteViewInfo: TcxCustomGridDetailsSiteViewInfo);
begin
  inherited Create(nil);
  Focusable := False;
  IsTabsContainer := True;
  Options := Options + [pcoFixedTabWidthWhenRotated];
  ParentBackground := False;
  FSiteViewInfo := ASiteViewInfo;
  FUnderlineHotKeys := True;
end;

function TcxGridLevelTabControl.GetActiveLevel: TcxGridLevel;
begin
  if TabIndex = -1 then
    Result := nil
  else
    Result := Levels[TabIndex];
end;

function TcxGridLevelTabControl.GetLevel(Index: Integer): TcxGridLevel;
begin
  Result := TcxGridLevel(Tabs.Objects[Index]);
end;

function TcxGridLevelTabControl.GetLevelCount: Integer;
begin
  Result := Tabs.Count;
end;

procedure TcxGridLevelTabControl.SetActiveLevel(Value: TcxGridLevel);
var
  ATabIndex: Integer;
begin
  ATabIndex := Tabs.IndexOfObject(Value);
  if ATabIndex = -1 then ATabIndex := 0;
  TabIndex := ATabIndex;
end;

procedure TcxGridLevelTabControl.SetUnderlineHotKeys(Value: Boolean);
var
  I: Integer;
begin
  if FUnderlineHotKeys <> Value then
  begin
    FUnderlineHotKeys := Value;
    for I := 0 to Tabs.Count - 1 do
      Tabs[I].Caption := GetLevelDisplayText(Levels[I]);
  end;
end;

procedure TcxGridLevelTabControl.CMDialogChar(var Message: TCMDialogChar);
begin
  // no default handling
end;

procedure TcxGridLevelTabControl.CMDrag(var Message: TCMDrag);
begin
  // to restore correct handle after previous TabControl was destroyed as result of tab change
  Message.DragRec.Source.DragHandle := Handle;
  // no default behavior - message goes to parent in WndProc
end;

procedure TcxGridLevelTabControl.AfterPaintTab(ACanvas: TcxCanvas; ATab: TcxTab;
  AImageAndTextData: TcxPCOutTabImageAndTextData);

  function GetDesignSelectionBounds: TRect;
  begin
    Result := AImageAndTextData.TabTextRect;
    InflateRect(Result, cxDesignSelectionWidth, cxDesignSelectionWidth);
    if IsVerticalText(Self) then
      InflateRect(Result, 0, 1)
    else
      InflateRect(Result, 1, 0);
  end;

begin
  inherited;
  if SiteViewInfo.Container.IsDesigning and
    SiteViewInfo.DesignController.IsObjectSelected(Levels[ATab.Index]) then
    ACanvas.DrawDesignSelection(GetDesignSelectionBounds);
end;

procedure TcxGridLevelTabControl.Change;
begin
  inherited;
  SiteViewInfo.ChangeActiveTab(ActiveLevel, FocusActiveViewOnChange);
end;

function TcxGridLevelTabControl.GetLevelDisplayText(ALevel: TcxGridLevel): string;

  procedure ConvertTextToDisplayText(var AText: string);
  var
    I: Integer;
  begin
    for I := Length(AText) downto 1 do
      if AText[I] = cHotkeyPrefix then
        Insert(cHotkeyPrefix, AText, I);
  end;

begin
  Result := ALevel.Caption;
  if cxGridTabAccelSupport then
    if UnderlineHotKeys then
      // nothing to do
    else
    begin
      Result := StripHotkey(Result);
      ConvertTextToDisplayText(Result);
    end
  else
    ConvertTextToDisplayText(Result);
end;

function TcxGridLevelTabControl.GetTabHitTestClass: TcxGridDetailsSiteTabHitTestClass;
begin
  Result := TcxGridDetailsSiteTabHitTest;
end;

function TcxGridLevelTabControl.HandleDialogChar(Key: Integer): Boolean;
begin
  FocusActiveViewOnChange := (SiteViewInfo.ActiveGridView <> nil) and
    SiteViewInfo.ActiveGridView.Focused;
  try
    Result := inherited HandleDialogChar(Key);
  finally
    FocusActiveViewOnChange := False;
  end;
end;

procedure TcxGridLevelTabControl.Notification(AComponent: TComponent; AOperation: TOperation);
var
  ATabIndex: Integer;
begin
  inherited;
  if (AOperation = opRemove) and (AComponent is TcxGridLevel) then
  begin
    ATabIndex := Tabs.IndexOfObject(AComponent);
    if ATabIndex <> -1 then
      Tabs.Delete(ATabIndex);
  end;
end;

procedure TcxGridLevelTabControl.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
var
  ATabIndex: Integer;
  AParent: TWinControl;
  P: TPoint;
begin
  if (Button = mbLeft) and not (ssDouble in Shift) and SiteViewInfo.Container.IsDesigning then
  begin
    ATabIndex := IndexOfTabAt(X, Y);
    if ATabIndex <> -1 then
      SiteViewInfo.DesignController.SelectObject(Levels[ATabIndex], not (ssShift in Shift));
  end;
  AParent := Parent;
  P := AParent.ScreenToClient(ClientToScreen(Point(X, Y)));
  inherited;
  TWinControlAccess(AParent).MouseDown(Button, Shift, P.X, P.Y);
end;

procedure TcxGridLevelTabControl.PrepareTabCanvasFont(ATab: TcxTab; ACanvas: TcxCanvas);
var
  AParams: TcxViewParams;
begin
  inherited;
  if (Levels[ATab.Index] = nil) or (LookAndFeel.SkinPainter <> nil) then Exit;
  SiteViewInfo.GetLevelTabParams(Levels[ATab.Index], AParams);
  ACanvas.Font := AParams.Font;
  ACanvas.Font.Color := AParams.TextColor;
end;

procedure TcxGridLevelTabControl.WndProc(var Message: TMessage);
begin
  inherited;
  // TabControl is transparent for drag & drop: message goes to parent (site)
  if Message.Msg = CM_DRAG then
    with Message do
      Result := Parent.Perform(Msg, WParam, LParam);
end;

procedure TcxGridLevelTabControl.DblClick;
begin
  inherited;
  TWinControlAccess(Parent).DblClick;
end;

function TcxGridLevelTabControl.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
  MousePos: TPoint): Boolean;
begin
  Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos);
  if not Result then
    Result := TWinControlAccess(Parent).DoMouseWheel(Shift, WheelDelta, MousePos);
end;

procedure TcxGridLevelTabControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  with Parent.ScreenToClient(ClientToScreen(Point(X, Y))) do
    TWinControlAccess(Parent).MouseMove(Shift, X, Y);
end;

procedure TcxGridLevelTabControl.MouseUp(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
var
  AParent: TWinControl;
  P: TPoint;
begin
  AParent := Parent;
  P := AParent.ScreenToClient(ClientToScreen(Point(X, Y)));
  inherited;
  TWinControlAccess(AParent).MouseUp(Button, Shift, P.X, P.Y);
end;

procedure TcxGridLevelTabControl.AddLevel(ALevel: TcxGridLevel);
var
  ATabIndex: Integer;
begin
  ATabIndex := Tabs.AddObject(GetLevelDisplayText(ALevel), ALevel);
  Tabs[ATabIndex].ImageIndex := ALevel.ImageIndex;
  ALevel.FreeNotification(Self);
end;

function TcxGridLevelTabControl.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
var
  ATabIndex: Integer;
begin
  ATabIndex := IndexOfTabAt(P.X, P.Y);
  if ATabIndex = -1 then
    Result := nil
  else
  begin
    Result := GetTabHitTestClass.Instance(P);
    Result.ViewInfo := nil;
    TcxGridDetailsSiteTabHitTest(Result).Level := Levels[ATabIndex];
    SiteViewInfo.InitTabHitTest(TcxGridDetailsSiteTabHitTest(Result));
  end;
end;

{$ENDIF}

{ TcxCustomGridDetailsSiteTabsViewInfo }

constructor TcxCustomGridDetailsSiteTabsViewInfo.Create(ASiteViewInfo: TcxCustomGridDetailsSiteViewInfo);
begin
  inherited Create;
  FSiteViewInfo := ASiteViewInfo;
{$IFDEF USETABCONTROL}
  FTabControl := GetTabControlClass.Create(FSiteViewInfo);
  InitTabControl;
{$ELSE}
  CreateItems;
{$ENDIF}
end;

destructor TcxCustomGridDetailsSiteTabsViewInfo.Destroy;
begin
{$IFDEF USETABCONTROL}
  TabControl.Parent := nil;
  FreeAndNil(FTabControl);
{$ELSE}
  DestroyItems;
{$ENDIF}
  inherited;
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetActiveLevel: TcxGridLevel;
begin
  Result := FSiteViewInfo.ActiveLevel;
end;

{$IFNDEF USETABCONTROL}

function TcxCustomGridDetailsSiteTabsViewInfo.GetCanvas: TcxCanvas;
begin
  Result := FSiteViewInfo.Canvas;
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetCount: Integer;
begin
  Result := FItems.Count;
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetItem(Index: Integer): TcxCustomGridDetailsSiteTabViewInfo;
begin
  Result := TcxCustomGridDetailsSiteTabViewInfo(FItems[Index]);
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;
begin
  Result := FSiteViewInfo.LookAndFeelPainter;
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetMainSize: Integer;
begin
  if IsVertical then
    Result := Width
  else
    Result := Height;
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetTabSize: Integer;
begin
  Result := MainSize - TabsAreaOffset - (cxGridTabsRootSize - 1);
end;

{$ENDIF}

function TcxCustomGridDetailsSiteTabsViewInfo.GetHeight: Integer;
begin
  if FHeight = 0 then
    FHeight := CalculateHeight;
  Result := FHeight;
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetLevel: TcxGridLevel;
begin
  Result := FSiteViewInfo.Level;
end;

function TcxCustomGridDetailsSiteTabsViewInfo.GetWidth: Integer;
begin
  if FWidth = 0 then
    FWidth := CalculateWidth;
  Result := FWidth;
end;

{$IFNDEF USETABCONTROL}

procedure TcxCustomGridDetailsSiteTabsViewInfo.CreateItems;
var
  I: Integer;
begin
  FItems := TList.Create;
  for I := 0 to Level.VisibleCount - 1 do
    FItems.Add(GetItemClass.Create(Self, Level.VisibleItems[I]));
end;

procedure TcxCustomGridDetailsSiteTabsViewInfo.DestroyItems;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do
    Items[I].Free;
  FItems.Free;
end;

{$ENDIF}

function TcxCustomGridDetailsSiteTabsViewInfo.CalculateHeight: Integer;
{$IFNDEF USETABCONTROL}
var
  I: Integer;
{$ENDIF}
begin
{$IFDEF USETABCONTROL}
  if IsVertical then
    Result := TabControl.GetOptimalSize
  else
    Result := TabControl.DisplayRect.Top;
{$ELSE}
  Result := 2 * TabsAreaOffset;
  for I := 0 to Count - 1 do
    Inc(Result, GetItemHeight(Items[I]));
{$ENDIF}
end;

function TcxCustomGridDetailsSiteTabsViewInfo.CalculateWidth: Integer;
{$IFNDEF USETABCONTROL}
var
  I, AItemWidth: Integer;
{$ENDIF}
begin
{$IFDEF USETABCONTROL}
  if IsVertical then
    Result := TabControl.DisplayRect.Left
  else
    Result := TabControl.GetOptimalSize;
{$ELSE}
  Result := 0;
  for I := 0 to Count - 1 do
  begin

⌨️ 快捷键说明

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