{----------------------------------------------------------------------------- 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.