Componentes.Terceros.jvcl/official/3.32/devtools/JvExVCL/src/JvExExtCtrls.pas

259 lines
6.6 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvExExtCtrls.pas, released on 2004-01-04
The Initial Developer of the Original Code is Andreas Hausladen [Andreas dott Hausladen att gmx dott de]
Portions created by Andreas Hausladen are Copyright (C) 2004 Andreas Hausladen.
All Rights Reserved.
Contributor(s): -
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvExExtCtrls.pas 10613 2006-05-19 19:21:43Z jfudickar $
unit JvExExtCtrls;
{$I jvcl.inc}
{MACROINCLUDE JvExControls.macros}
WARNINGHEADER
interface
uses
Windows, Messages,
{$IFDEF HAS_UNIT_TYPES}
Types,
{$ENDIF HAS_UNIT_TYPES}
SysUtils, Classes, Graphics, Controls, Forms, ExtCtrls,
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
JvTypes, JvThemes, JVCLVer, JvExControls;
type
CONTROL_DECL_DEFAULT(Shape)
CONTROL_DECL_DEFAULT(PaintBox)
CONTROL_DECL_DEFAULT(Image)
CONTROL_DECL_DEFAULT(Bevel)
WINCONTROL_DECL_DEFAULT(CustomPanel)
TJvExPubCustomPanel = class(TJvExCustomPanel)
COMMON_PUBLISHED
end;
WINCONTROL_DECL_DEFAULT(CustomRadioGroup)
TJvExSplitter = class(TSplitter, IJvExControl)
CONTROL_DECL
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
end;
WINCONTROL_DECL_DEFAULT(CustomControlBar)
WINCONTROL_DECL_DEFAULT(ControlBar)
WINCONTROL_DECL_DEFAULT(Panel)
WINCONTROL_DECL_DEFAULT(RadioGroup)
WINCONTROL_DECL_DEFAULT(Page)
WINCONTROL_DECL_DEFAULT(Notebook)
WINCONTROL_DECL_DEFAULT(Header)
{$IFDEF COMPILER6_UP}
CONTROL_DECL_DEFAULT(BoundLabel)
WINCONTROL_DECL_DEFAULT(CustomLabeledEdit)
WINCONTROL_DECL_DEFAULT(LabeledEdit)
WINCONTROL_DECL_DEFAULT(CustomColorBox)
WINCONTROL_DECL_DEFAULT(ColorBox)
{$ENDIF COMPILER6_UP}
// SplitterMouseDownFix fixes a bug in the VCL that causes the splitter to no
// more work with the control in the left/top of it when the control has a size
// of 0. This is actually a TWinControl.AlignControl bug.
procedure SplitterMouseDownFix(Splitter: TSplitter);
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/devtools/JvExVCL/src/JvExExtCtrls.pas $';
Revision: '$Revision: 10613 $';
Date: '$Date: 2006-05-19 21:21:43 +0200 (ven., 19 mai 2006) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
CONTROL_IMPL_DEFAULT(Shape)
CONTROL_IMPL_DEFAULT(PaintBox)
CONTROL_IMPL_DEFAULT(Image)
CONTROL_IMPL_DEFAULT(Bevel)
WINCONTROL_IMPL_DEFAULT(CustomPanel)
WINCONTROL_IMPL_DEFAULT(CustomRadioGroup)
WINCONTROL_IMPL_DEFAULT(CustomControlBar)
WINCONTROL_IMPL_DEFAULT(ControlBar)
WINCONTROL_IMPL_DEFAULT(Panel)
WINCONTROL_IMPL_DEFAULT(RadioGroup)
WINCONTROL_IMPL_DEFAULT(Page)
WINCONTROL_IMPL_DEFAULT(Notebook)
WINCONTROL_IMPL_DEFAULT(Header)
{$IFDEF COMPILER6_UP}
CONTROL_IMPL_DEFAULT(BoundLabel)
WINCONTROL_IMPL_DEFAULT(CustomLabeledEdit)
WINCONTROL_IMPL_DEFAULT(LabeledEdit)
WINCONTROL_IMPL_DEFAULT(CustomColorBox)
WINCONTROL_IMPL_DEFAULT(ColorBox)
{$ENDIF COMPILER6_UP}
CONTROL_IMPL_DEFAULT(Splitter)
procedure TJvExSplitter.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SplitterMouseDownFix(Self);
inherited MouseDown(Button, Shift, X, Y);
end;
// SplitterMouseDownFix fixes a bug in the VCL that causes the splitter to no
// more work with the control in the left/top of it when the control has a size
// of 0. This is actually a TWinControl.AlignControl bug.
procedure SplitterMouseDownFix(Splitter: TSplitter);
var
Control: TControl;
Pt: TPoint;
R: TRect;
I, Size: Integer;
begin
with Splitter do
begin
if Align in [alLeft, alTop] then
begin
Control := nil;
Pt := Point(Left, Top);
if Align = alLeft then
Dec(Pt.X)
else //if Align = alTop then
Dec(Pt.Y);
for I := 0 to Parent.ControlCount - 1 do
begin
Control := Parent.Controls[I];
R := Control.BoundsRect;
if Align = alLeft then
Size := R.Right - R.Left
else //if Align = alTop then
Size := R.Bottom - R.Top;
if Control.Visible and Control.Enabled and (Size = 0) then
begin
if Align = alLeft then
Dec(R.Left)
else // Align = alTop then
Dec(R.Top);
if PtInRect(R, Pt) then
Break;
end;
Control := nil;
end;
if Control = nil then
begin
// Check for the control that is zero-sized but after the splitter.
// TWinControl.AlignControls does not work properly with alLeft/alTop.
if Align = alLeft then
Pt := Point(Left + Width - 1, Top)
else // if Align = alTop then
Pt := Point(Left, Top + Height - 1);
for I := 0 to Parent.ControlCount - 1 do
begin
Control := Parent.Controls[I];
R := Control.BoundsRect;
if Align = alLeft then
Size := R.Right - R.Left
else //if Align = alTop then
Size := R.Bottom - R.Top;
if Control.Visible and Control.Enabled and (Size = 0) then
begin
if Align = alLeft then
Dec(R.Left)
else // Align = alTop then
Dec(R.Top);
if PtInRect(R, Pt) then
Break;
end;
Control := nil;
end;
if Control <> nil then
begin
// realign left/top control
if Align = alLeft then
Control.Left := -1
else // if Align = alTop then
Control.Top := -1;
end;
end;
end;
end;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.