MG: implemented DestroyCaret

git-svn-id: trunk@511 -
This commit is contained in:
lazarus 2001-12-12 14:23:19 +00:00
parent 6566f466f4
commit 6db5507f43
7 changed files with 116 additions and 28 deletions

View File

@ -1172,6 +1172,9 @@ var
i: integer; i: integer;
begin begin
//writeln('[TCustomSynEdit.Destroy]'); //writeln('[TCustomSynEdit.Destroy]');
{$IFDEF SYN_LAZARUS}
if HandleAllocated then LCLLinux.DestroyCaret(Handle);
{$ENDIF}
Highlighter := nil; Highlighter := nil;
// free listeners while other fields are still valid // free listeners while other fields are still valid
if Assigned(fHookedCommandHandlers) then begin if Assigned(fHookedCommandHandlers) then begin
@ -3616,7 +3619,7 @@ begin
//writeln('[TCustomSynEdit.WMKillFocus] A'); //writeln('[TCustomSynEdit.WMKillFocus] A');
HideCaret; HideCaret;
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
LCLLinux.DestroyCaret; LCLLinux.DestroyCaret(Handle);
{$ELSE} {$ELSE}
Windows.DestroyCaret; Windows.DestroyCaret;
{$ENDIF} {$ENDIF}

View File

@ -129,7 +129,7 @@ begin
Result := False; Result := False;
end; end;
function TInterfaceBase.DestroyCaret: Boolean; function TInterfaceBase.DestroyCaret(Handle : HWND): Boolean;
begin begin
Result := False; Result := False;
end; end;
@ -498,6 +498,9 @@ end;
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.21 2001/12/12 14:23:17 lazarus
MG: implemented DestroyCaret
Revision 1.20 2001/11/14 19:10:03 lazarus Revision 1.20 2001/11/14 19:10:03 lazarus
MG: fixes for parser and linkscanner and small cleanups MG: fixes for parser and linkscanner and small cleanups

View File

@ -130,9 +130,9 @@ begin
Result := InterfaceObject.DeleteObject(GDIObject); Result := InterfaceObject.DeleteObject(GDIObject);
end; end;
function DestroyCaret: Boolean; function DestroyCaret(Handle : HWND): Boolean;
Begin Begin
Result := InterfaceObject.DestroyCaret; Result := InterfaceObject.DestroyCaret(Handle);
end; end;
Function DrawFrameControl(DC: HDC; var Rect : TRect; uType, uState : Cardinal) : Boolean; Function DrawFrameControl(DC: HDC; var Rect : TRect; uType, uState : Cardinal) : Boolean;
@ -1027,6 +1027,9 @@ end;
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.20 2001/12/12 14:23:18 lazarus
MG: implemented DestroyCaret
Revision 1.19 2001/11/14 17:46:58 lazarus Revision 1.19 2001/11/14 17:46:58 lazarus
Changes to make toggling between form and unit work. Changes to make toggling between form and unit work.
Added BringWindowToTop Added BringWindowToTop

View File

@ -52,7 +52,7 @@ function CreateRectRgn(X1,Y1,X2,Y2 : Integer): HRGN; {$IFDEF IF_BASE_MEMBER}virt
function DeleteDC(hDC: HDC): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function DeleteDC(hDC: HDC): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}
function DeleteObject(GDIObject: HGDIOBJ): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function DeleteObject(GDIObject: HGDIOBJ): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}
function DestroyCaret: Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function DestroyCaret(Handle : HWND): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}
Function DrawFrameControl(DC: HDC; var Rect : TRect; uType, uState : Cardinal) : Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} Function DrawFrameControl(DC: HDC; var Rect : TRect; uType, uState : Cardinal) : Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}
function DrawEdge(DC: HDC; var Rect: TRect; edge: Cardinal; grfFlags: Cardinal): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function DrawEdge(DC: HDC; var Rect: TRect; edge: Cardinal; grfFlags: Cardinal): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}
@ -241,6 +241,9 @@ function UnionRect(var lprcDst: TRect; const lprcSrc1, lprcSrc2: TRect): Boolean
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.16 2001/12/12 14:23:18 lazarus
MG: implemented DestroyCaret
Revision 1.15 2001/11/14 17:46:58 lazarus Revision 1.15 2001/11/14 17:46:58 lazarus
Changes to make toggling between form and unit work. Changes to make toggling between form and unit work.
Added BringWindowToTop Added BringWindowToTop

View File

@ -895,8 +895,7 @@ begin
GTKObject := PGTKObject(Handle); GTKObject := PGTKObject(Handle);
Result := GTKObject <> nil; Result := GTKObject <> nil;
if Result if Result then begin
then begin
if gtk_type_is_a(gtk_object_type(GTKObject), GTKAPIWidget_GetType) if gtk_type_is_a(gtk_object_type(GTKObject), GTKAPIWidget_GetType)
then begin then begin
if IsValidGDIObjectType(Bitmap, gdiBitmap) if IsValidGDIObjectType(Bitmap, gdiBitmap)
@ -1328,11 +1327,24 @@ end;
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
function TgtkObject.DestroyCaret: Boolean; function TgtkObject.DestroyCaret(Handle: HWND): Boolean;
Begin var
Assert(False, 'Trace:TODO: [TgtkObject.DestroyCaret]'); GTKObject: PGTKObject;
//TODO: Implement this; begin
Result := False; GTKObject := PGTKObject(Handle);
Result := true;
if GTKObject<>nil then begin
if gtk_type_is_a(gtk_object_type(GTKObject), GTKAPIWidget_GetType)
then begin
GTKAPIWidget_DestroyCaret(PGTKAPIWidget(GTKObject));
end
// else if // TODO: other widgettypes
else begin
Result := False;
end;
end
else Assert(False, 'Trace:WARNING: [TgtkObject.DestroyCaret] Got null HWND');
end; end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
@ -4072,6 +4084,9 @@ end;
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.51 2001/12/12 14:23:18 lazarus
MG: implemented DestroyCaret
Revision 1.50 2001/12/11 16:51:37 lazarus Revision 1.50 2001/12/11 16:51:37 lazarus
Modified the Watches dialog Modified the Watches dialog
Shane Shane

View File

@ -36,7 +36,7 @@ function CreateRectRgn(X1,Y1,X2,Y2 : Integer): HRGN;
function DeleteDC(hDC: HDC): Boolean; override; function DeleteDC(hDC: HDC): Boolean; override;
function DeleteObject(GDIObject: HGDIOBJ): Boolean; override; function DeleteObject(GDIObject: HGDIOBJ): Boolean; override;
function DestroyCaret: Boolean; override; function DestroyCaret(Handle : HWND): Boolean; override;
Function DrawFrameControl(DC: HDC; var Rect : TRect; uType, uState : Cardinal) : Boolean; override; Function DrawFrameControl(DC: HDC; var Rect : TRect; uType, uState : Cardinal) : Boolean; override;
function DrawEdge(DC: HDC; var Rect: TRect; edge: Cardinal; grfFlags: Cardinal): Boolean; override; function DrawEdge(DC: HDC; var Rect: TRect; edge: Cardinal; grfFlags: Cardinal): Boolean; override;
@ -126,6 +126,9 @@ Function WindowFromPoint(Point : TPoint) : HWND; override;
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.20 2001/12/12 14:23:18 lazarus
MG: implemented DestroyCaret
Revision 1.19 2001/11/14 17:46:59 lazarus Revision 1.19 2001/11/14 17:46:59 lazarus
Changes to make toggling between form and unit work. Changes to make toggling between form and unit work.
Added BringWindowToTop Added BringWindowToTop

View File

@ -49,6 +49,7 @@ function GTKAPIWidget_GetType : guint;
function GTKAPIWidget_New : PGTKWidget; function GTKAPIWidget_New : PGTKWidget;
procedure GTKAPIWidget_CreateCaret(APIWidget: PGTKAPIWidget; procedure GTKAPIWidget_CreateCaret(APIWidget: PGTKAPIWidget;
AWidth, AHeight: Integer; ABitmap: PGDKPixmap); AWidth, AHeight: Integer; ABitmap: PGDKPixmap);
procedure GTKAPIWidget_DestroyCaret(APIWidget: PGTKAPIWidget);
procedure GTKAPIWidget_HideCaret(APIWidget: PGTKAPIWidget); procedure GTKAPIWidget_HideCaret(APIWidget: PGTKAPIWidget);
procedure GTKAPIWidget_ShowCaret(APIWidget: PGTKAPIWidget); procedure GTKAPIWidget_ShowCaret(APIWidget: PGTKAPIWidget);
procedure GTKAPIWidget_SetCaretPos(APIWidget: PGTKAPIWidget; X, Y: Integer); procedure GTKAPIWidget_SetCaretPos(APIWidget: PGTKAPIWidget; X, Y: Integer);
@ -104,13 +105,21 @@ try
Result := 0; Result := 0;
exit; exit;
end; end;
except
Writeln('------Exception 1 in GTKAPIWidgetClient_Timer------');
end;
try
GTKAPIWidgetClient_DrawCaret(Client); GTKAPIWidgetClient_DrawCaret(Client);
except
Writeln('------Exception 2 in GTKAPIWidgetClient_Timer------');
end;
try
if PGTKAPIWidgetClient(Client)^.Caret.Timer<>0 then if PGTKAPIWidgetClient(Client)^.Caret.Timer<>0 then
Result := 1 Result := 1
else else
Result := 0; Result := 0;
except except
Writeln('------Exception in GTKAPIWidgetClient_Timer------'); Writeln('------Exception 3 in GTKAPIWidgetClient_Timer------');
writeln('Client = ',longint(Client)); writeln('Client = ',longint(Client));
if Assigned(Client) then if Assigned(Client) then
begin begin
@ -317,7 +326,7 @@ end;
procedure GTKAPIWidgetClient_HideCaret(Client: PGTKAPIWidgetClient); procedure GTKAPIWidgetClient_HideCaret(Client: PGTKAPIWidgetClient);
begin begin
//writeln('[GTKAPIWidgetClient_HideCaret] A'); //writeln('[GTKAPIWidgetClient_HideCaret] A Client=',HexStr(Cardinal(Client),8));
if Client = nil if Client = nil
then begin then begin
WriteLn('WARNING: [GTKAPIWidgetClient_HideCaret] Got nil client'); WriteLn('WARNING: [GTKAPIWidgetClient_HideCaret] Got nil client');
@ -333,6 +342,7 @@ const
(GTK_STATE_INSENSITIVE, GTK_STATE_NORMAL); (GTK_STATE_INSENSITIVE, GTK_STATE_NORMAL);
var var
Widget: PGTKWidget; Widget: PGTKWidget;
HasFocus: boolean;
begin begin
if Client = nil then begin if Client = nil then begin
WriteLn('WARNING: [GTKAPIWidgetClient_DrawCaret] Got nil client'); WriteLn('WARNING: [GTKAPIWidgetClient_DrawCaret] Got nil client');
@ -341,11 +351,15 @@ begin
Widget := PGTKWidget(Client); Widget := PGTKWidget(Client);
with Client^.Caret do begin with Client^.Caret do begin
if (Timer <> 0) and ((not Blinking) or (not Visible)) then begin HasFocus:=gtk_widget_has_focus(Widget);
if (Timer <> 0) and
((not Blinking) or (not Visible)
or (ShowHideOnFocus and (not HasFocus)))
then begin
gtk_timeout_remove(Timer); gtk_timeout_remove(Timer);
Timer := 0; Timer := 0;
end; end;
if IsDrawn and ((not Visible) or Blinking) then begin if IsDrawn and ((not Visible) or Blinking) then begin
// hide caret // hide caret
if (BackPixmap <> nil) and (Widget<>nil) and (Widget^.theStyle<>nil) if (BackPixmap <> nil) and (Widget<>nil) and (Widget^.theStyle<>nil)
@ -362,31 +376,41 @@ begin
and (not IsDrawn) and (not IsDrawn)
then begin then begin
if Pixmap <> nil then if Pixmap <> nil then
Assert(False, 'Trace:TODO: [GTKAPIWidgetClient_ShowCaret] Implement bitmap'); Assert(False, 'Trace:TODO: [GTKAPIWidgetClient_DrawCaret] Implement bitmap');
//Create backbitmap if needed //Create backbitmap if needed
if (BackPixmap = nil) and (Widget^.Window<>nil) if (BackPixmap = nil) and (Widget^.Window<>nil) and (Width>0)
then BackPixmap := gdk_pixmap_new(Widget^.Window, Width, Height, -1); and (Height>0)
then
BackPixmap := gdk_pixmap_new(Widget^.Window, Width, Height, -1);
if (BackPixmap <> nil) and (Widget<>nil) and ((Widget^.theStyle)<>nil) if (BackPixmap <> nil) and (Widget<>nil) and ((Widget^.theStyle)<>nil)
and (Width>0) and (Height>0)
then gdk_draw_pixmap( then gdk_draw_pixmap(
BackPixmap, BackPixmap,
PGTKStyle(Widget^.theStyle)^.bg_gc[GTK_STATE_NORMAL], PGTKStyle(Widget^.theStyle)^.bg_gc[GTK_STATE_NORMAL],
Widget^.Window, X, Y, 0, 0, Width, Height Widget^.Window, X, Y, 0, 0, Width, Height
); );
// draw caret // draw caret
if PGTKStyle(PGTKWidget(Client)^.theStyle)<>nil then if (PGTKStyle(PGTKWidget(Client)^.theStyle)<>nil)
and (PGTKWidget(Client)^.Window<>nil)
and (Width>0) and (Height>0)
and (PGTKWidget(Client)^.theStyle<>nil) then
gdk_draw_rectangle( gdk_draw_rectangle(
PGTKWidget(Client)^.Window, PGTKWidget(Client)^.Window,
PGTKStyle(PGTKWidget(Client)^.theStyle)^.fg_gc[GC_STATE[Integer(Pixmap) <> 1]], PGTKStyle(PGTKWidget(Client)^.theStyle)^.fg_gc[GC_STATE[Integer(Pixmap) <> 1]],
1, X, Y, Width, Height 1, X, Y, Width, Height
); )
else
writeln('Draw Caret failed: X=',X,',Y=',Y,',W=',Width,',H=',Height,',',Pixmap<>nil,',',PGTKWidget(Client)^.Window<>nil,',',PGTKWidget(Client)^.theStyle<>nil);
IsDrawn := True; IsDrawn := True;
end; end;
//writeln('GTKAPIWidgetClient_DrawCaret A Client=',HexStr(Cardinal(Client),8),' Timer=',Timer,' Blink=',Blinking,' Visible=',Visible,' ShowHideOnFocus=',ShowHideOnFocus,' Focus=',gtk_widget_has_focus(Widget));
if Visible and Blinking and (Timer = 0) if Visible and Blinking and (Timer = 0)
and (gtk_widget_has_focus(Widget) or not ShowHideOnFocus) and (not ShowHideOnFocus or HasFocus)
then then
Timer := gtk_timeout_add(500, @GTKAPIWidgetClient_Timer, Client); Timer := gtk_timeout_add(500, @GTKAPIWidgetClient_Timer, Client);
end; end;
@ -394,7 +418,7 @@ end;
procedure GTKAPIWidgetClient_ShowCaret(Client: PGTKAPIWidgetClient); procedure GTKAPIWidgetClient_ShowCaret(Client: PGTKAPIWidgetClient);
begin begin
//writeln('[GTKAPIWidgetClient_ShowCaret] A'); //writeln('[GTKAPIWidgetClient_ShowCaret] A Client=',HexStr(Cardinal(Client),8));
if Client = nil if Client = nil
then begin then begin
WriteLn('WARNING: [GTKAPIWidgetClient_ShowCaret] Got nil client'); WriteLn('WARNING: [GTKAPIWidgetClient_ShowCaret] Got nil client');
@ -410,10 +434,10 @@ procedure GTKAPIWidgetClient_CreateCaret(Client: PGTKAPIWidgetClient;
var var
IsVisible: Boolean; IsVisible: Boolean;
begin begin
//writeln('[GTKAPIWidgetClient_CreateCaret] A'); //writeln('********** [GTKAPIWidgetClient_CreateCaret] A Client=',HexStr(Cardinal(Client),8),' Width=',AWidth,' Height=',AHeight,' Bitmap=',ABitmap<>nil);
if Client = nil if Client = nil
then begin then begin
WriteLn('WARNING: [GTKAPIWidgetClient_HideCaret] Got nil client'); WriteLn('WARNING: [GTKAPIWidgetClient_CreateCaret] Got nil client');
Exit; Exit;
end; end;
@ -436,6 +460,27 @@ begin
end; end;
end; end;
procedure GTKAPIWidgetClient_DestroyCaret(Client: PGTKAPIWidgetClient);
begin
writeln('********** [GTKAPIWidgetClient_DestroyCaret] A Client=',HexStr(Cardinal(Client),8));
if Client = nil
then begin
WriteLn('WARNING: [GTKAPIWidgetClient_DestroyCaret] Got nil client');
Exit;
end;
with Client^.Caret do begin
if Visible then GTKAPIWidgetClient_HideCaret(Client);
if BackPixmap <> nil then begin
gdk_pixmap_unref(BackPixmap);
BackPixmap := nil;
end;
Pixmap := nil;
end;
writeln('********** B[GTKAPIWidgetClient_DestroyCaret] A Client=',HexStr(Cardinal(Client),8));
end;
procedure GTKAPIWidgetClient_SetCaretPos(Client: PGTKAPIWidgetClient; procedure GTKAPIWidgetClient_SetCaretPos(Client: PGTKAPIWidgetClient;
AX, AY: Integer); AX, AY: Integer);
var var
@ -586,6 +631,16 @@ begin
AWidth, AHeight, ABitmap); AWidth, AHeight, ABitmap);
end; end;
procedure GTKAPIWidget_DestroyCaret(APIWidget: PGTKAPIWidget);
begin
if APIWidget = nil
then begin
WriteLn('WARNING: [GTKAPIWidget_DestroyCaret] Got nil client');
Exit;
end;
GTKAPIWidgetClient_DestroyCaret(PGTKAPIWidgetClient(APIWidget^.Client));
end;
procedure GTKAPIWidget_HideCaret(APIWidget: PGTKAPIWidget); procedure GTKAPIWidget_HideCaret(APIWidget: PGTKAPIWidget);
begin begin
//writeln('[GTKAPIWidget_HideCaret] A'); //writeln('[GTKAPIWidget_HideCaret] A');
@ -644,6 +699,9 @@ end.
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.17 2001/12/12 14:23:19 lazarus
MG: implemented DestroyCaret
Revision 1.16 2001/11/13 18:50:10 lazarus Revision 1.16 2001/11/13 18:50:10 lazarus
Changes to facilitate the toggle between form and unit Changes to facilitate the toggle between form and unit
Shane Shane