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 + -
显示快捷键?