richmemo: carbon - implementing selection change event. The only way seems possible, by tracking selection before and after mouse/keyboard event. Todo: check if the event is fired, if selection is changed by code

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4623 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2016-04-20 03:37:36 +00:00
parent 180a5c96c9
commit 16f014853b

View File

@ -524,6 +524,30 @@ begin
CGContextFillRect(aContext, r); CGContextFillRect(aContext, r);
end; end;
type
TIntCustomRichMemo = class(TCustomRichMemo);
function CarbonRichEdit_ChangeSel(ANextHandler: EventHandlerCallRef;
AEvent: EventRef;
AWidget: TCarbonWidget): OSStatus; {$IFDEF darwin}mwpascal;{$ENDIF}
var
sofs, eofs: TXNOffset;
sofs2, eofs2: TXNOffset;
begin
// selection before
TXNGetSelection( HITextViewGetTXNObject(AWidget.Widget), sofs, eofs);
Result := CallNextEventHandler(ANextHandler, AEvent);
// selection after
TXNGetSelection( HITextViewGetTXNObject(AWidget.Widget), sofs2, eofs2);
// seems like something has changed!
// Sorry, for the direct access!
if (sofs<>sofs2) or (eofs<>eofs2) then
TIntCustomRichMemo( AWidget.LCLObject ).DoSelectionChange;
end;
function CarbonRichEdit_Draw(ANextHandler: EventHandlerCallRef; function CarbonRichEdit_Draw(ANextHandler: EventHandlerCallRef;
AEvent: EventRef; AEvent: EventRef;
AWidget: TCarbonWidget): OSStatus; {$IFDEF darwin}mwpascal;{$ENDIF} AWidget: TCarbonWidget): OSStatus; {$IFDEF darwin}mwpascal;{$ENDIF}
@ -542,6 +566,7 @@ end;
procedure TCarbonRichEdit.RegisterEvents; procedure TCarbonRichEdit.RegisterEvents;
var var
TmpSpec: EventTypeSpec; TmpSpec: EventTypeSpec;
TmpSpecArr: array [0..2] of EventTypeSpec;
begin begin
inherited RegisterEvents; inherited RegisterEvents;
@ -553,6 +578,15 @@ begin
1, @TmpSpec, Pointer(Self), nil); 1, @TmpSpec, Pointer(Self), nil);
end; end;
// It's unclear, if there's a better way for tracking change of selection
TmpSpecArr[0]:=MakeEventSpec(kEventClassKeyboard, kEventRawKeyRepeat); // by keyboard
TmpSpecArr[1]:=MakeEventSpec(kEventClassKeyboard, kEventRawKeyDown);
TmpSpecArr[2]:=MakeEventSpec(kEventClassControl, kEventControlTrack); // by mouse
InstallControlEventHandler(Widget,
RegisterEventHandler(@CarbonRichEdit_ChangeSel),
3, @TmpSpecArr, Pointer(Self), nil);
target :=HIViewGetEventTarget(Widget); target :=HIViewGetEventTarget(Widget);
end; end;