📄 jvdockvsnetstyle.pas
字号:
begin
Result := nil;
FCurrentPos := FBlockStartOffset;
for I := 0 to BlockCount - 1 do
begin
for J := 0 to Blocks[I].VSPaneCount - 1 do
begin
if not Blocks[I].VSPanes[J].FVisible then
Continue;
GetBlockRect(Blocks[I], J, ARect);
if PtInRect(ARect, MousePos) then
begin
Result := Blocks[I].VSPanes[J];
Exit;
end;
end;
Inc(FCurrentPos, FBlockInterval);
end;
end;
function TJvDockVSChannel.GetPaneWithControl(AControl: TControl): TJvDockVSPane;
var
I, J: Integer;
begin
Result := nil;
for I := 0 to BlockCount - 1 do
for J := 0 to Blocks[I].VSPaneCount - 1 do
if AControl = Blocks[I].VSPanes[J].FDockForm then
begin
Result := Blocks[I].VSPanes[J];
Exit;
end;
end;
procedure TJvDockVSChannel.HidePopupPanel(Pane: TJvDockVSPane);
begin
if Pane <> nil then
begin
if Align in [alLeft, alRight] then
begin
VSPopupPanel.Width := 0;
VSPopupPanelSplitter.Width := 0;
end
else
if Align in [alTop, alBottom] then
begin
VSPopupPanel.Height := 0;
VSPopupPanelSplitter.Height := 0;
end;
FActiveDockForm := nil;
FActivePane := nil;
end;
VSPopupPanel.Visible := False;
VSPopupPanelSplitter.Visible := False;
FActivePane := nil;
end;
procedure TJvDockVSChannel.HidePopupPanel(Control: TWinControl);
var
BlockIndex, PaneIndex: Integer;
begin
FindDockControl(Control, BlockIndex, PaneIndex);
if (BlockIndex >= 0) and (PaneIndex >= 0) then
HidePopupPanel(Blocks[BlockIndex].VSPanes[PaneIndex]);
end;
procedure TJvDockVSChannel.HidePopupPanelWithAnimate;
begin
if FActivePane <> nil then
PopupPanelAnimate.HideForm(Self, FActivePane.FWidth);
end;
procedure TJvDockVSChannel.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
VSPane: TJvDockVSPane;
begin
inherited MouseDown(Button, Shift, X, Y);
VSPane := GetDockFormWithMousePos(Point(X, Y));
if VSPane <> nil then
begin
// There is not "DockFormVisible" or "Hidden" property, so we just use
// VSPane.FDockForm.CanFocus, which seems to work fine.
if VSPane.FDockForm.CanFocus then
begin
VSPane.FActive := True;
VSPane.FDockForm.SetFocus;
end
else
PopupDockForm(VSPane);
end;
end;
procedure TJvDockVSChannel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
inherited MouseMove(Shift, X, Y);
// Create the timer object if not existing
if FAnimationStartTimer = nil then
begin
FAnimationStartTimer := TTimer.Create(nil);
FAnimationStartTimer.OnTimer := AnimationStartTimerOnTimerHandler;
FAnimationStartTimer.Interval := TJvDockVSNetStyle.GetAnimationStartInterval;
FAnimationStartTimer.Enabled := True;
end
// Restart the timer only, if mouse is above another pane now
else
if GetDockFormWithMousePos(Point(X, Y)) <> Pointer(FAnimationStartTimer.Tag) then
begin
FAnimationStartTimer.Enabled := False;
FAnimationStartTimer.Enabled := True;
end;
// Store pane under mouse in tag property of the timer
FAnimationStartTimer.Tag := Integer(GetDockFormWithMousePos(Point(X, Y)));
end;
procedure TJvDockVSChannel.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
inherited MouseUp(Button, Shift, X, Y);
end;
procedure TJvDockVSChannel.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if Operation = opRemove then
begin
if AComponent = FVSPopupPanel then
begin
FVSPopupPanel := nil;
DestroyVSPopupPanel;
end
else
if AComponent = FVSPopupPanelSplitter then
begin
FVSPopupPanelSplitter := nil;
DestroyVSPopupPanel;
end;
end;
end;
procedure TJvDockVSChannel.Paint;
var
I: Integer;
procedure DrawSingleBlock(Block: TJvDockVSBlock);
var
DrawRect: TRect;
I: Integer;
OldGraphicsMode: Integer;
VisiblePaneCount: Integer;
procedure AdjustImagePos;
begin
if Align = alLeft then
begin
Inc(DrawRect.Left, 3);
Inc(DrawRect.Top, 4);
end
else
if Align = alTop then
begin
Inc(DrawRect.Left, 4);
Inc(DrawRect.Top, 2);
end
else
if Align = alRight then
begin
Inc(DrawRect.Left, 4);
Inc(DrawRect.Top, 4);
end
else
if Align = alBottom then
begin
Inc(DrawRect.Left, 4);
Inc(DrawRect.Top, 3);
end;
end;
begin
VisiblePaneCount := 0;
for I := 0 to Block.VSPaneCount - 1 do
begin
if not Block.VSPanes[I].FVisible then
Continue;
GetBlockRect(Block, I, DrawRect);
Canvas.Brush.Color := (DockServer.DockStyle as TJvDockVSNetStyle).ChannelOption.TabColor;
Canvas.FillRect(DrawRect);
Canvas.Brush.Color := clGray;
Canvas.FrameRect(DrawRect);
AdjustImagePos;
Block.FImageList.Draw(Canvas, DrawRect.Left, DrawRect.Top, I);
if Block.ActiveDockControl = Block.VSPanes[I].FDockForm then
begin
if Align in [alTop, alBottom] then
Inc(DrawRect.Left, Block.InactiveBlockWidth)
else
if Align in [alLeft, alRight] then
begin
Inc(DrawRect.Top, Block.InactiveBlockWidth);
if Align = alLeft then
DrawRect.Left := 15
else
DrawRect.Left := 20;
DrawRect.Right := DrawRect.Left + (DrawRect.Bottom - DrawRect.Top);
end;
Canvas.Brush.Color := (DockServer.DockStyle as TJvDockVSNetStyle).ChannelOption.TabColor;
Canvas.Pen.Color := clBlack;
Dec(DrawRect.Right, 3);
OldGraphicsMode := SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
Canvas.Brush.Style := bsClear;
DrawText(Canvas.Handle, PChar(Block.VSPanes[I].FDockForm.Caption), -1, DrawRect, DT_END_ELLIPSIS or DT_NOCLIP);
SetGraphicsMode(Canvas.Handle, OldGraphicsMode);
end;
Inc(VisiblePaneCount);
end;
if VisiblePaneCount > 0 then
Inc(FCurrentPos, FBlockInterval);
end;
begin
inherited Paint;
FCurrentPos := FBlockStartOffset;
for I := 0 to BlockCount - 1 do
DrawSingleBlock(Blocks[I]);
end;
procedure TJvDockVSChannel.PopupDockForm(Control: TWinControl);
var
BlockIndex, PaneIndex: Integer;
begin
FindDockControl(Control, BlockIndex, PaneIndex);
if (BlockIndex >= 0) and (PaneIndex >= 0) then
PopupDockForm(Blocks[BlockIndex].VSPanes[PaneIndex]);
end;
procedure TJvDockVSChannel.PopupDockForm(Pane: TJvDockVSPane);
procedure SetSingleDockFormVisible(HostDockSite: TWinControl; AForm: TForm);
var
I: Integer;
begin
for I := 0 to HostDockSite.DockClientCount - 1 do
HostDockSite.DockClients[I].Visible := AForm = HostDockSite.DockClients[I];
end;
begin
if (Pane <> nil) and (ActiveDockForm <> Pane.FDockForm) then
begin
HidePopupPanel(FActivePane);
Pane.FDockForm.Visible := True;
PopupPanelAnimate.PopupForm(Self, Pane.FWidth);
if (Pane.FDockForm <> nil) and (Pane.FDockForm.HostDockSite.Parent is TJvDockTabHostForm) then
begin
FVSPopupPanel.JvDockManager.ShowSingleControl(Pane.FDockForm.HostDockSite.Parent);
SetSingleDockFormVisible(Pane.FDockForm.HostDockSite, Pane.FDockForm);
TJvDockTabHostForm(Pane.FDockForm.HostDockSite.Parent).Caption := Pane.FDockForm.Caption;
end
else
FVSPopupPanel.JvDockManager.ShowSingleControl(Pane.FDockForm);
FActiveDockForm := Pane.FDockForm;
FActivePane := Pane;
FVSPopupPanel.JvDockManager.ResetBounds(True);
Pane.FBlock.ActiveDockControl := Pane.FDockForm;
// Invalidate;
end;
end;
procedure TJvDockVSChannel.RemoveAllBlock;
var
I: Integer;
begin
for I := BlockCount - 1 downto 0 do
DeleteBlock(I);
FActiveDockForm := nil;
end;
procedure TJvDockVSChannel.RemoveDockControl(Control: TWinControl);
var
BlockIndex, PaneIndex: Integer;
begin
VSPopupPanel.Visible := False;
if FindDockControl(Control, BlockIndex, PaneIndex) then
begin
Blocks[BlockIndex].DeletePane(PaneIndex);
if (Blocks[BlockIndex].VSPaneCount <= 0) or (Blocks[BlockIndex].FBlockType = btTabBlock) then
DeleteBlock(BlockIndex);
end;
ResetPosition;
Invalidate;
end;
procedure TJvDockVSChannel.ResetActivePaneWidth;
var
DockClient: TJvDockClient;
begin
if FActivePane = nil then
Exit;
DockClient := FindDockClient(FActivePane.FDockForm);
if Align in [alLeft, alRight] then
FActivePane.FWidth := VSPopupPanel.Width
else
if Align in [alTop, alBottom] then
FActivePane.FWidth := VSPopupPanel.Height + VSPopupPanel.JvDockManager.GrabberSize;
if DockClient <> nil then
DockClient.VSPaneWidth := FActivePane.FWidth;
end;
procedure TJvDockVSChannel.ResetBlock;
var
I: Integer;
begin
if BlockCount > 0 then
begin
Blocks[0].FBlockStartPos := FBlockStartOffset;
for I := 1 to BlockCount - 1 do
Blocks[I].FBlockStartPos := Blocks[I - 1].FBlockStartPos + Blocks[I - 1].GetTotalWidth + FBlockInterval;
end;
end;
procedure TJvDockVSChannel.ResetFontAngle;
var
LogFont: TLogFont;
begin
if Align in [alLeft, alRight] then
if GetObject(Canvas.Font.Handle, SizeOf(LogFont), @LogFont) <> 0 then
begin
LogFont.lfEscapement := 2700;
LogFont.lfOrientation := 2700;
Canvas.Font.Handle := CreateFontIndirect(LogFont);
end;
end;
procedure TJvDockVSChannel.ResetPopupPanelHeight;
begin
if Align in [alLeft, alRight] then
begin
VSPopupPanel.Top := Top;
VSPopupPanel.Height := Height;
VSPopupPanelSplitter.Top := Top;
VSPopupPanelSplitter.Height := Height;
end;
end;
procedure TJvDockVSChannel.ResetPosition;
var
I, J: Integer;
PaneCount: Integer;
begin
PaneCount := 0;
for I := 0 to BlockCount - 1 do
for J := 0 to Blocks[I].VSPaneCount - 1 do
if Blocks[I].VSPanes[J].FVisible = True then
Inc(PaneCount);
Visible := PaneCount > 0;
case Align of
alLeft:
begin
Width := FChannelWidth;
Left := GetClientAlignControlArea(Parent, Align, Self);
end;
alRight:
begin
Width := FChannelWidth;
Left := Parent.ClientWidth - GetClientAlignControlArea(Parent, Align, Self) - FChannelWidth + 1;
end;
alTop:
begin
Height := FChannelWidth;
Top := GetClientAlignControlArea(Parent, Align, Self);
end;
alBottom:
begin
Height := FChannelWidth;
Top := Parent.ClientHeight - GetClientAlignControlArea(Parent, Align, Self) - FChannelWidth + 1;
end;
end;
end;
procedure TJvDockVSChannel.SetActivePaneSize(const Value: Integer);
begin
if FActivePaneSize <> Value then
begin
FActivePaneSize := Value;
Invalidate;
end;
end;
procedure TJvDockVSChannel.SetBlockStartOffset(const Value: Integer);
begin
FBlockStartOffset := Value;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -