mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-19 21:42:37 +02:00
901 lines
26 KiB
PHP
901 lines
26 KiB
PHP
// included by buttons.pp
|
|
|
|
{******************************************************************************
|
|
TSpeedButton
|
|
******************************************************************************
|
|
|
|
*****************************************************************************
|
|
* *
|
|
* This file is part of the Lazarus Component Library (LCL) *
|
|
* *
|
|
* See the file COPYING.LCL, included in this distribution, *
|
|
* for details about the copyright. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
* *
|
|
*****************************************************************************
|
|
}
|
|
|
|
{$IFOPT C-}
|
|
// Uncomment for local trace
|
|
// {$C+}
|
|
// {$DEFINE ASSERT_IS_ON}
|
|
{$ENDIF}
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedbutton.Create
|
|
Params: none
|
|
Returns: Nothing
|
|
|
|
Constructor for the class.
|
|
------------------------------------------------------------------------------}
|
|
constructor TSpeedbutton.Create(AOwner: TComponent);
|
|
begin
|
|
Inherited Create(AOwner);
|
|
FCompStyle := csSpeedButton;
|
|
|
|
FGlyph := TButtonGlyph.Create;
|
|
FGlyph.OnChange := @GlyphChanged;
|
|
|
|
SetInitialBounds(0, 0, 23, 22);
|
|
ControlStyle := ControlStyle + [csCaptureMouse]-[csSetCaption]-csMultiClicks;
|
|
|
|
FLayout:= blGlyphLeft;
|
|
FAllowAllUp:= false;
|
|
FMouseInControl := False;
|
|
FDragging := False;
|
|
FSpacing := 4;
|
|
FMargin := -1;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedbutton.Destroy
|
|
Params: None
|
|
Returns: Nothing
|
|
|
|
Destructor for the class.
|
|
------------------------------------------------------------------------------}
|
|
destructor TSpeedbutton.Destroy;
|
|
begin
|
|
FreeAndNil(FGlyph);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedbutton.Click
|
|
Params:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedbutton.Click;
|
|
begin
|
|
inherited Click;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetAllowAllUp
|
|
Params: Value:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetAllowAllUp(Value : Boolean);
|
|
begin
|
|
if FAllowAllUp <> Value
|
|
then begin
|
|
FAllowAllUp := Value;
|
|
UpdateExclusive;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetDown
|
|
Params: Value:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetDown(Value : Boolean);
|
|
var
|
|
OldState: TButtonState;
|
|
begin
|
|
if FGroupIndex = 0 then Value:= false;
|
|
if FDown <> Value then begin
|
|
if FDown and not FAllowAllUp then Exit;
|
|
FDown := Value;
|
|
OldState := fState;
|
|
if FDown then begin
|
|
fState := bsExclusive;
|
|
end else begin
|
|
FState := bsUp;
|
|
end;
|
|
if OldState<>FState then
|
|
Invalidate;
|
|
if Value then UpdateExclusive;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetFlat
|
|
Params: Value:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetFlat(const Value : boolean);
|
|
begin
|
|
if FFlat <> Value then begin
|
|
FFlat := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetGlyph
|
|
Params: Value:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetGlyph(Value : TBitmap);
|
|
begin
|
|
FGlyph.Glyph := Value;
|
|
Invalidate;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetGroupIndex
|
|
Params: Value:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetGroupIndex(const Value : Integer);
|
|
begin
|
|
if FGroupIndex <> Value
|
|
then begin
|
|
FGroupIndex := Value;
|
|
UpdateExclusive;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetMargin
|
|
Params: Value:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetMargin(const Value : Integer);
|
|
begin
|
|
if FMargin <> Value then begin
|
|
FMargin := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetNumGlyphs
|
|
Params: Value : Integer = Number of glyphs in the file/resource
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetNumGlyphs(Value : integer);
|
|
Begin
|
|
if Value < 0 then Value := 1;
|
|
if Value > 4 then Value := 4;
|
|
|
|
if Value <> TButtonGlyph(fGlyph).NumGlyphs then
|
|
Begin
|
|
TButtonGlyph(fGlyph).NumGlyphs := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetSpacing
|
|
Params: Value:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetSpacing(const Value : Integer);
|
|
begin
|
|
if FSpacing <> Value then begin
|
|
FSpacing := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
procedure TSpeedButton.SetText(const Value: TCaption);
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetText(const Value: TCaption);
|
|
begin
|
|
if Caption=Value then exit;
|
|
inherited SetText(Value);
|
|
Invalidate;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
procedure TSpeedButton.UpdateState(InvalidateOnChange: boolean);
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.UpdateState(InvalidateOnChange: boolean);
|
|
var
|
|
OldState: TButtonState;
|
|
begin
|
|
OldState:=FState;
|
|
if not Enabled then begin
|
|
FState := bsDisabled;
|
|
FDragging := False;
|
|
end else begin
|
|
if FState = bsDisabled
|
|
then begin
|
|
if FDown and (GroupIndex <> 0)
|
|
then FState := bsExclusive
|
|
else FState := bsUp;
|
|
end;
|
|
end;
|
|
if InvalidateOnChange
|
|
and ((FState<>OldState) or (FLastDrawFlags<>GetDrawFlags))
|
|
then
|
|
Invalidate;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
function TSpeedButton.GetDrawFlags: integer;
|
|
------------------------------------------------------------------------------}
|
|
function TSpeedButton.GetDrawFlags: integer;
|
|
begin
|
|
Result:=DFCS_BUTTONPUSH;
|
|
if FState in [bsDown, bsExclusive] then inc(Result,DFCS_PUSHED);
|
|
if FMouseInControl then inc(Result,DFCS_CHECKED);
|
|
if not Enabled then inc(Result,DFCS_INACTIVE);
|
|
|
|
if Flat and (not (csDesigning in ComponentState)) and
|
|
not FMouseInControl and not (FState in [bsDown, bsExclusive])
|
|
then
|
|
inc(Result,DFCS_FLAT);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.UpdateExclusive
|
|
Params: none
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.UpdateExclusive;
|
|
var
|
|
msg : TLMessage;
|
|
begin
|
|
if (FGroupIndex <> 0) and (Parent <> nil)
|
|
then begin
|
|
MSg.MSg := CM_ButtonPressed;
|
|
Msg.WParam := FGroupIndex;
|
|
Msg.LParam := Longint(self);
|
|
Msg.Result := 0;
|
|
Parent.Broadcast(Msg);
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Function: TSpeedButton.GetGlyph
|
|
Params: none
|
|
Returns: The bitmap
|
|
|
|
------------------------------------------------------------------------------}
|
|
function TSpeedbutton.GetGlyph : TBitmap;
|
|
begin
|
|
Result := FGlyph.Glyph;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.GetNumGlyphs
|
|
Params: none
|
|
Returns: The number stored in TButtonGlyph(FGlyph).NumGlyphs
|
|
|
|
------------------------------------------------------------------------------}
|
|
Function TSpeedButton.GetNumGlyphs : Integer;
|
|
Begin
|
|
Result := TButtonGlyph(fGlyph).NumGlyphs;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.GlyphChanged
|
|
Params: Sender - The glyph that changed
|
|
Returns: zippo
|
|
|
|
------------------------------------------------------------------------------}
|
|
Procedure TSpeedButton.GlyphChanged(Sender : TObject);
|
|
Begin
|
|
//redraw the button;
|
|
Invalidate;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedbutton.Paint
|
|
Params: none
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedbutton.Paint;
|
|
var
|
|
PaintRect: TRect;
|
|
GlyphWidth, GlyphHeight: Integer;
|
|
Offset, OffsetCap: TPoint;
|
|
ClientSize, TotalSize, TextSize: TSize;
|
|
//BrushStyle : TBrushStyle;
|
|
M, S : integer;
|
|
TXTStyle : TTextStyle;
|
|
SIndex : Longint;
|
|
TMP : String;
|
|
begin
|
|
UpdateState(false);
|
|
if FGlyph=nil then exit;
|
|
|
|
PaintRect:= ClientRect;
|
|
|
|
{if Transparent and not (csDesigning in ComponentState) then
|
|
BrushStyle:= bsClear
|
|
else
|
|
BrushStyle:= bsSolid;}
|
|
|
|
FLastDrawFlags:=GetDrawFlags;
|
|
//writeln('TSpeedbutton.Paint ',Name,':',ClassName,' Parent.Name=',Parent.Name);
|
|
DrawFrameControl(Canvas.GetUpdatedHandle([csBrushValid,csPenValid]),
|
|
PaintRect, DFC_BUTTON, FLastDrawFlags);
|
|
|
|
GlyphWidth:= TButtonGlyph(FGlyph).Glyph.Width;
|
|
if TButtonGlyph(FGlyph).NumGlyphs > 1 then
|
|
GlyphWidth:=GlyphWidth div NumGlyphs;
|
|
GlyphHeight:=TButtonGlyph(FGlyph).Glyph.Height;
|
|
|
|
ClientSize.cx:= PaintRect.Right - PaintRect.Left;
|
|
ClientSize.cy:= PaintRect.Bottom - PaintRect.Top;
|
|
|
|
if Caption <> '' then begin
|
|
TMP := Caption;
|
|
SIndex := DeleteAmpersands(TMP);
|
|
TextSize:= Canvas.TextExtent(TMP);
|
|
If SIndex > 0 then
|
|
If SIndex <= Length(TMP) then begin
|
|
FShortcut := Ord(TMP[SIndex]);
|
|
end;
|
|
end
|
|
else begin
|
|
TextSize.cx:= 0;
|
|
TextSize.cy:= 0;
|
|
end;
|
|
|
|
if (GlyphWidth = 0) or (GlyphHeight = 0)
|
|
or (TextSize.cx = 0) or (TextSize.cy = 0)
|
|
then
|
|
S:= 0
|
|
else
|
|
S:= Spacing;
|
|
|
|
{ Calculate caption and glyph layout }
|
|
|
|
if Margin = -1 then begin
|
|
if S = -1 then begin
|
|
TotalSize.cx:= TextSize.cx + GlyphWidth;
|
|
TotalSize.cy:= TextSize.cy + GlyphHeight;
|
|
if Layout in [blGlyphLeft, blGlyphRight] then
|
|
M:= (ClientSize.cx - TotalSize.cx) div 3
|
|
else
|
|
M:= (ClientSize.cy - TotalSize.cy) div 3;
|
|
S:= M;
|
|
end else begin
|
|
TotalSize.cx:= GlyphWidth + S + TextSize.cx;
|
|
TotalSize.cy:= GlyphHeight + S + TextSize.cy;
|
|
if Layout in [blGlyphLeft, blGlyphRight] then
|
|
M:= (ClientSize.cx - TotalSize.cx + 1) div 2
|
|
else
|
|
M:= (ClientSize.cy - TotalSize.cy + 1) div 2
|
|
end;
|
|
end else begin
|
|
if S = -1 then begin
|
|
TotalSize.cx:= ClientSize.cx - (Margin + GlyphWidth);
|
|
TotalSize.cy:= ClientSize.cy - (Margin + GlyphHeight);
|
|
if Layout in [blGlyphLeft, blGlyphRight] then
|
|
S:= (TotalSize.cx - TextSize.cx) div 2
|
|
else
|
|
S:= (TotalSize.cy - TextSize.cy) div 2;
|
|
end;
|
|
M:= Margin
|
|
end;
|
|
|
|
case Layout of
|
|
blGlyphLeft : begin
|
|
Offset.X:= M;
|
|
Offset.Y:= (ClientSize.cy - GlyphHeight + 1) div 2;
|
|
OffsetCap.X:= Offset.X + GlyphWidth + S;
|
|
OffsetCap.Y:= (ClientSize.cy - TextSize.cy) div 2;
|
|
end;
|
|
blGlyphRight : begin
|
|
Offset.X:= ClientSize.cx - M - GlyphWidth;
|
|
Offset.Y:= (ClientSize.cy - GlyphHeight + 1) div 2;
|
|
OffsetCap.X:= Offset.X - S - TextSize.cx;
|
|
OffsetCap.Y:= (ClientSize.cy - TextSize.cy) div 2;
|
|
end;
|
|
blGlyphTop : begin
|
|
Offset.X:= (ClientSize.cx - GlyphWidth + 1) div 2;
|
|
Offset.Y:= M;
|
|
OffsetCap.X:= (ClientSize.cx - TextSize.cx + 1) div 2;
|
|
OffsetCap.Y:= Offset.Y + GlyphHeight + S;
|
|
end;
|
|
blGlyphBottom : begin
|
|
Offset.X:= (ClientSize.cx - GlyphWidth + 1) div 2;
|
|
Offset.Y:= ClientSize.cy - M - GlyphHeight;
|
|
OffsetCap.X:= (ClientSize.cx - TextSize.cx + 1) div 2;
|
|
OffsetCap.Y:= Offset.Y - S - TextSize.cy;
|
|
end;
|
|
end;
|
|
|
|
FGlyph.Draw(Canvas, PaintRect, Offset, FState, Transparent, 0);
|
|
if Caption <> '' then begin
|
|
TXTStyle := Canvas.TextStyle;
|
|
TXTStyle.Opaque := False;
|
|
TXTStyle.Clipping := True;
|
|
TXTStyle.ShowPrefix := True;
|
|
TXTStyle.Alignment := taLeftJustify;
|
|
TXTStyle.Layout := tlTop;
|
|
TXTStyle.SystemFont := True;//Match System Default Style
|
|
With PaintRect, OffsetCap do begin
|
|
Left := Left + X;
|
|
Top := Top + Y;
|
|
end;
|
|
If not Enabled then begin
|
|
Canvas.Font.Color := clBtnHighlight;
|
|
OffsetRect(PaintRect, 1, 1);
|
|
Canvas.TextRect(PaintRect, 0, 0, Caption, TXTStyle);
|
|
Canvas.Font.Color := clBtnShadow;
|
|
OffsetRect(PaintRect, -1, -1);
|
|
end
|
|
else
|
|
Canvas.Font.Color := clBtnText;
|
|
//writeln('TSpeedButton.Paint PaintRect=',PaintRect.Left,',',PaintRect.TOp,',',PaintRect.Right,',',PaintRect.Bottom);
|
|
Canvas.TextRect(PaintRect, 0, 0, Caption, TXTStyle);
|
|
end;
|
|
|
|
inherited Paint;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.UpdateTracking
|
|
Params: none
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.UpdateTracking;
|
|
var
|
|
P : TPoint;
|
|
begin
|
|
if FFlat and Enabled
|
|
then begin
|
|
GetCursorPos(p);
|
|
FMouseInControl := not (FindDragTarget(P, True) = Self);
|
|
if FMouseInControl
|
|
then Perform(CM_MOUSELEAVE,0,0)
|
|
else Perform(CM_MOUSEENTER,0,0);
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.MouseDown
|
|
Params: Button:
|
|
Shift:
|
|
X, Y:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
begin
|
|
inherited MouseDown(Button, Shift, X, Y);
|
|
if csDesigning in ComponentState then exit;
|
|
|
|
if (Button = mbLeft) and Enabled
|
|
then begin
|
|
if not FDown
|
|
then begin
|
|
FState := bsDown;
|
|
Invalidate;
|
|
end;
|
|
FDragging := True;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.MouseMove
|
|
Params: Shift:
|
|
X, Y:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.MouseMove(Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
NewState: TButtonState;
|
|
begin
|
|
inherited MouseMove(Shift, X, Y);
|
|
if csDesigning in ComponentState then exit;
|
|
|
|
if FDragging
|
|
then begin
|
|
Assert(False,'Trace:FDragging is true');
|
|
if not FDown then
|
|
NewState := bsUp
|
|
else
|
|
NewState := bsExclusive;
|
|
|
|
if (X >= 0) and (X < Width)
|
|
and (Y >= 0) and (Y < Height)
|
|
then begin
|
|
if FDown then
|
|
NewState := bsExclusive
|
|
else
|
|
NewState := bsDown;
|
|
end;
|
|
|
|
if NewState <> FState
|
|
then begin
|
|
FState := NewState;
|
|
Invalidate;
|
|
end;
|
|
end
|
|
else begin
|
|
{if not FMouseInControl then begin
|
|
UpdateTracking;
|
|
end;}
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.MouseUp
|
|
Params: Button:
|
|
Shift:
|
|
X, Y:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
begin
|
|
if not (csDesigning in ComponentState) and FDragging
|
|
then begin
|
|
FDragging := False;
|
|
|
|
if FGroupIndex = 0
|
|
then begin
|
|
FState := bsUp;
|
|
FMouseInControl := False;
|
|
if not (FState in [bsExclusive, bsDown]) then
|
|
Invalidate;
|
|
end
|
|
else begin
|
|
SetDown(not FDown);
|
|
if FDown then Invalidate;
|
|
end;
|
|
//UpdateTracking;
|
|
end;
|
|
inherited MouseUp(Button, Shift, X, Y);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetLayout
|
|
Params: Value: new layout value
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetLayout(const Value : TButtonLayout);
|
|
begin
|
|
if Value <> FLayout then begin
|
|
FLayout:= Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.SetTransparent
|
|
Params: Value: new transparency value
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.SetTransparent(const Value : boolean);
|
|
begin
|
|
if Value <> FTransparent then begin
|
|
FTransparent:= Value;
|
|
if Value then ControlStyle:= ControlStyle + [csOpaque]
|
|
else ControlStyle:= ControlStyle - [csOpaque];
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.CMButtonPressed
|
|
Params: Message:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.CMButtonPressed(var Message : TLMessage);
|
|
var
|
|
Sender : TSpeedButton;
|
|
begin
|
|
if csDesigning in ComponentState then exit;
|
|
if Message.WParam = FGroupIndex
|
|
then begin
|
|
Sender := TSpeedButton(Message.LParam);
|
|
if Sender <> Self
|
|
then begin
|
|
if Sender.Down and FDown
|
|
then begin
|
|
FDown := False;
|
|
FState := bsUp;
|
|
Invalidate;
|
|
end;
|
|
FAllowAllUp := Sender.AllowAllUp;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.CMEnabledChanged
|
|
Params: Message:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.CMEnabledChanged(var Message: TLMEssage);
|
|
Begin
|
|
//Should create a new glyph based on the new state
|
|
|
|
//UpdateTracking;
|
|
Invalidate;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.CMMouseEnter
|
|
Params: Message:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.CMMouseEnter(var Message :TLMessage);
|
|
begin
|
|
inherited CMMouseEnter(Message);
|
|
if csDesigning in ComponentState then exit;
|
|
|
|
if not FMouseInControl
|
|
and Enabled and (GetCapture = 0)
|
|
then begin
|
|
FMouseInControl := True;
|
|
UpdateState(true);
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Method: TSpeedButton.CMMouseLeave
|
|
Params: Message:
|
|
Returns: nothing
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure TSpeedButton.CMMouseLeave(var Message :TLMessage);
|
|
begin
|
|
inherited CMMouseLeave(Message);
|
|
if csDesigning in ComponentState then exit;
|
|
|
|
if FMouseInControl
|
|
and Enabled {and not FDragging}
|
|
then begin
|
|
FMouseInControl := False;
|
|
UpdateState(true);
|
|
end;
|
|
end;
|
|
|
|
|
|
{$IFDEF ASSERT_IS_ON}
|
|
{$UNDEF ASSERT_IS_ON}
|
|
{$C-}
|
|
{$ENDIF}
|
|
|
|
|
|
// included by buttons.pp
|
|
|
|
{ =============================================================================
|
|
|
|
$Log$
|
|
Revision 1.41 2003/06/23 09:42:09 mattias
|
|
fixes for debugging lazarus
|
|
|
|
Revision 1.40 2002/08/17 23:41:34 mattias
|
|
many clipping fixes
|
|
|
|
Revision 1.39 2003/06/18 11:21:06 mattias
|
|
fixed taborder=0, implemented TabOrder Editor
|
|
|
|
Revision 1.38 2003/04/29 13:35:39 mattias
|
|
improved configure build lazarus dialog
|
|
|
|
Revision 1.37 2003/04/02 13:23:23 mattias
|
|
fixed default font
|
|
|
|
Revision 1.36 2003/03/11 07:46:44 mattias
|
|
more localization for gtk- and win32-interface and lcl
|
|
|
|
Revision 1.35 2003/02/16 01:40:43 mattias
|
|
fixed uninitialized style
|
|
|
|
Revision 1.34 2003/02/06 20:46:51 mattias
|
|
default fpc src dirs and clean ups
|
|
|
|
Revision 1.33 2003/02/06 06:33:57 mattias
|
|
fixed message
|
|
|
|
Revision 1.32 2003/01/27 13:49:16 mattias
|
|
reduced speedbutton invalidates, added TCanvas.Frame
|
|
|
|
Revision 1.31 2002/11/21 18:49:53 mattias
|
|
started OnMouseEnter and OnMouseLeave
|
|
|
|
Revision 1.30 2002/09/27 20:52:23 lazarus
|
|
MWE: Applied patch from "Andrew Johnson" <aj_genius@hotmail.com>
|
|
|
|
Here is the run down of what it includes -
|
|
|
|
-Vasily Volchenko's Updated Russian Localizations
|
|
|
|
-improvements to GTK Styles/SysColors
|
|
-initial GTK Palette code - (untested, and for now useless)
|
|
|
|
-Hint Windows and Modal dialogs now try to stay transient to
|
|
the main program form, aka they stay on top of the main form
|
|
and usually minimize/maximize with it.
|
|
|
|
-fixes to Form BorderStyle code(tool windows needed a border)
|
|
|
|
-fixes DrawFrameControl DFCS_BUTTONPUSH to match Win32 better
|
|
when flat
|
|
|
|
-fixes DrawFrameControl DFCS_BUTTONCHECK to match Win32 better
|
|
and to match GTK theme better. It works most of the time now,
|
|
but some themes, noteably Default, don't work.
|
|
|
|
-fixes bug in Bitmap code which broke compiling in NoGDKPixbuf
|
|
mode.
|
|
|
|
-misc other cleanups/ fixes in gtk interface
|
|
|
|
-speedbutton's should now draw correctly when flat in Win32
|
|
|
|
-I have included an experimental new CheckBox(disabled by
|
|
default) which has initial support for cbGrayed(Tri-State),
|
|
and WordWrap, and misc other improvements. It is not done, it
|
|
is mostly a quick hack to test DrawFrameControl
|
|
DFCS_BUTTONCHECK, however it offers many improvements which
|
|
can be seen in cbsCheck/cbsCrissCross (aka non-themed) state.
|
|
|
|
-fixes Message Dialogs to more accurately determine
|
|
button Spacing/Size, and Label Spacing/Size based on current
|
|
System font.
|
|
-fixes MessageDlgPos, & ShowMessagePos in Dialogs
|
|
-adds InputQuery & InputBox to Dialogs
|
|
|
|
-re-arranges & somewhat re-designs Control Tabbing, it now
|
|
partially works - wrapping around doesn't work, and
|
|
subcontrols(Panels & Children, etc) don't work. TabOrder now
|
|
works to an extent. I am not sure what is wrong with my code,
|
|
based on my other tests at least wrapping and TabOrder SHOULD
|
|
work properly, but.. Anyone want to try and fix?
|
|
|
|
-SynEdit(Code Editor) now changes mouse cursor to match
|
|
position(aka over scrollbar/gutter vs over text edit)
|
|
|
|
-adds a TRegion property to Graphics.pp, and Canvas. Once I
|
|
figure out how to handle complex regions(aka polygons) data
|
|
properly I will add Region functions to the canvas itself
|
|
(SetClipRect, intersectClipRect etc.)
|
|
|
|
-BitBtn now has a Stored flag on Glyph so it doesn't store to
|
|
lfm/lrs if Glyph is Empty, or if Glyph is not bkCustom(aka
|
|
bkOk, bkCancel, etc.) This should fix most crashes with older
|
|
GDKPixbuf libs.
|
|
|
|
Revision 1.29 2002/09/18 17:07:25 lazarus
|
|
MG: added patch from Andrew
|
|
|
|
Revision 1.28 2002/09/13 11:49:47 lazarus
|
|
Cleanups, extended TStatusBar, graphic control cleanups.
|
|
|
|
Revision 1.27 2002/09/12 15:53:10 lazarus
|
|
MG: small bugfixes
|
|
|
|
Revision 1.26 2002/09/12 15:35:57 lazarus
|
|
MG: small bugfixes
|
|
|
|
Revision 1.25 2002/09/06 16:14:19 lazarus
|
|
MG: fixed removing TSpeedButton
|
|
|
|
Revision 1.24 2002/09/03 22:31:25 lazarus
|
|
MG: removed old workaround in TSpeedButton
|
|
|
|
Revision 1.23 2002/09/03 08:07:20 lazarus
|
|
MG: image support, TScrollBox, and many other things from Andrew
|
|
|
|
Revision 1.22 2002/09/01 16:11:21 lazarus
|
|
MG: double, triple and quad clicks now works
|
|
|
|
Revision 1.21 2002/08/30 12:32:21 lazarus
|
|
MG: MoveWindowOrgEx, Splitted FWinControls/FControls, TControl drawing, Better DesignerDrawing, ...
|
|
|
|
Revision 1.20 2002/08/27 06:34:26 lazarus
|
|
MG: fixed codetools proc collection
|
|
|
|
Revision 1.19 2002/08/26 17:28:21 lazarus
|
|
MG: fixed speedbutton in designmode
|
|
|
|
Revision 1.18 2002/08/24 13:41:29 lazarus
|
|
MG: fixed TSpeedButton.SetDown and Invalidate
|
|
|
|
Revision 1.17 2002/08/22 16:43:35 lazarus
|
|
MG: improved theme support from Andrew
|
|
|
|
Revision 1.16 2002/08/19 20:34:47 lazarus
|
|
MG: improved Clipping, TextOut, Polygon functions
|
|
|
|
Revision 1.15 2002/06/01 08:41:28 lazarus
|
|
MG: DrawFramControl now uses gtk style, transparent STrechBlt
|
|
|
|
Revision 1.14 2002/05/10 06:05:55 lazarus
|
|
MG: changed license to LGPL
|
|
|
|
Revision 1.13 2002/02/25 17:08:50 lazarus
|
|
MG: reduced hints
|
|
|
|
Revision 1.12 2002/02/24 20:51:24 lazarus
|
|
Improved TSpeedButton (Glyph, Spacing, Margin, drawing)
|
|
Added PageCount to TNotebook
|
|
Optimized component selection buttons a bit.
|
|
|
|
Revision 1.11 2001/11/22 14:33:26 lazarus
|
|
MG: fixed painting background of flat speedbuttons
|
|
|
|
Revision 1.10 2001/10/18 13:01:33 lazarus
|
|
MG: fixed speedbuttons numglyphs>1 and started IDE debugging
|
|
|
|
Revision 1.9 2001/07/03 10:30:32 lazarus
|
|
MG: speedbuttonglyph centered, buttonglyph border fixed
|
|
|
|
Revision 1.8 2001/06/14 14:57:58 lazarus
|
|
MG: small bugfixes and less notes
|
|
|
|
Revision 1.7 2001/03/19 14:40:49 lazarus
|
|
MG: fixed many unreleased DC and GDIObj bugs
|
|
|
|
Revision 1.5 2001/02/06 14:52:47 lazarus
|
|
Changed TSpeedbutton in gtkobject so it erases itself when it's set to visible=false;
|
|
Shane
|
|
|
|
Revision 1.4 2001/01/12 18:46:50 lazarus
|
|
Named the speedbuttons in MAINIDE and took out some writelns.
|
|
Shane
|
|
|
|
Revision 1.3 2001/01/04 16:12:54 lazarus
|
|
Removed some writelns and changed the property editor for TStrings a bit.
|
|
Shane
|
|
|
|
Revision 1.2 2001/01/03 18:44:54 lazarus
|
|
The Speedbutton now has a numglyphs setting.
|
|
I started the TStringPropertyEditor
|
|
|
|
Revision 1.1 2000/07/13 10:28:28 michael
|
|
+ Initial import
|
|
|
|
Revision 1.10 2000/06/04 10:00:33 lazarus
|
|
MWE:
|
|
* Fixed bug #6.
|
|
|
|
Revision 1.9 2000/05/14 21:56:11 lazarus
|
|
MWE:
|
|
+ added local messageloop
|
|
+ added PostMessage
|
|
* fixed Peekmessage
|
|
* fixed ClientToScreen
|
|
* fixed Flat style of Speedutton (TODO: Draw)
|
|
+ Added TApplicatio.OnIdle
|
|
|
|
}
|