You've already forked lazarus-ccr
carbon: switch caret color to white, if background is black
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@958 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -32,15 +32,22 @@ uses
|
|||||||
|
|
||||||
WSRichMemo,
|
WSRichMemo,
|
||||||
|
|
||||||
CarbonProc, CarbonEdits;
|
CarbonDef, CarbonUtils,
|
||||||
|
CarbonPrivate, CarbonCanvas, CarbonProc, CarbonEdits;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TCarbonRichEdit }
|
{ TCarbonRichEdit }
|
||||||
|
|
||||||
TCarbonRichEdit = class(TCarbonMemo)
|
TCarbonRichEdit = class(TCarbonMemo)
|
||||||
|
private
|
||||||
|
fCaretVisible : Boolean;
|
||||||
|
fisBackBlack : Boolean;
|
||||||
|
target : EventTargetRef;
|
||||||
protected
|
protected
|
||||||
function GetCreationOptions: TXNFrameOptions; override;
|
function GetCreationOptions: TXNFrameOptions; override;
|
||||||
|
procedure PostDraw(acontext: CGContextRef);
|
||||||
|
procedure RegisterEvents; override;
|
||||||
public
|
public
|
||||||
function GetIndexedRunInfoFromRange(iIndex: ItemCount; iStartOffset, iEndOffset: TXNOffset;
|
function GetIndexedRunInfoFromRange(iIndex: ItemCount; iStartOffset, iEndOffset: TXNOffset;
|
||||||
var oRunStartOffset, oRunEndOffset: TXNOffset;
|
var oRunStartOffset, oRunEndOffset: TXNOffset;
|
||||||
@@ -50,9 +57,11 @@ type
|
|||||||
iCount: ItemCount; var ioTypeAttributes: array of TXNTypeAttributes): Boolean;
|
iCount: ItemCount; var ioTypeAttributes: array of TXNTypeAttributes): Boolean;
|
||||||
function SetTypeAttributes(iCount: ItemCount; const iTypeAttributes: array of TXNTypeAttributes;
|
function SetTypeAttributes(iCount: ItemCount; const iTypeAttributes: array of TXNTypeAttributes;
|
||||||
StartOffset, EndOffset: Integer): Boolean;
|
StartOffset, EndOffset: Integer): Boolean;
|
||||||
|
procedure SetColor(const AColor: TColor); override;
|
||||||
procedure InDelText(const text: WideString; replstart, repllength: Integer);
|
procedure InDelText(const text: WideString; replstart, repllength: Integer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ TCarbonWSCustomRichMemo }
|
{ TCarbonWSCustomRichMemo }
|
||||||
|
|
||||||
TCarbonWSCustomRichMemo = class(TWSCustomRichMemo)
|
TCarbonWSCustomRichMemo = class(TWSCustomRichMemo)
|
||||||
@@ -273,7 +282,6 @@ begin
|
|||||||
Result := edit.GetContinuousTypeAttributes(flags, 3, attr);
|
Result := edit.GetContinuousTypeAttributes(flags, 3, attr);
|
||||||
Params.Name := GetATSUFontName(astyle);
|
Params.Name := GetATSUFontName(astyle);
|
||||||
Params.Color := RGBColorToColor(maccolor);
|
Params.Color := RGBColorToColor(maccolor);
|
||||||
//writeln('got color: ', IntToHex(Params.Color, 8));
|
|
||||||
Params.Style := GetATSUFontStyles(astyle) + QDStyleToFontStyle(attr[1].data.dataValue);
|
Params.Style := GetATSUFontStyles(astyle) + QDStyleToFontStyle(attr[1].data.dataValue);
|
||||||
Params.Size := GetATSUFontSize(astyle);
|
Params.Size := GetATSUFontSize(astyle);
|
||||||
|
|
||||||
@@ -295,7 +303,6 @@ begin
|
|||||||
|
|
||||||
ParamsToTXNAttribs(Params, attr, Count, maccolor);
|
ParamsToTXNAttribs(Params, attr, Count, maccolor);
|
||||||
|
|
||||||
writeln('setting attr, start = ', textstart, ', end = ', textStart + textLen, ' color = ', IntToHex(Params.Color,8));
|
|
||||||
memo.SetTypeAttributes(Count, Attr, TextStart, TextStart+TextLen);
|
memo.SetTypeAttributes(Count, Attr, TextStart, TextStart+TextLen);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -393,7 +400,6 @@ begin
|
|||||||
// see TXNFlattenObjectToCFDataRef notes
|
// see TXNFlattenObjectToCFDataRef notes
|
||||||
CFRelease(data);
|
CFRelease(data);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TCarbonRichEdit }
|
{ TCarbonRichEdit }
|
||||||
@@ -403,6 +409,90 @@ begin
|
|||||||
Result := kOutputTextInUnicodeEncodingMask;
|
Result := kOutputTextInUnicodeEncodingMask;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCarbonRichEdit.PostDraw(acontext: CGContextRef);
|
||||||
|
var
|
||||||
|
point : HIPoint;
|
||||||
|
obj : TXNObject;
|
||||||
|
pst,
|
||||||
|
pend : TXNOffset;
|
||||||
|
x,y : Integer;
|
||||||
|
w,h : Fixed;
|
||||||
|
linenum : UInt32;
|
||||||
|
r : CGRect;
|
||||||
|
flags : TXNContinuousFlags;
|
||||||
|
attr : TXNTypeAttributes;
|
||||||
|
event : EventRef;
|
||||||
|
ref : ControlRef;
|
||||||
|
refcon : Integer;
|
||||||
|
ofs : LongWord;
|
||||||
|
hh : Word;
|
||||||
|
const
|
||||||
|
caretHorzOffset = 1;
|
||||||
|
caretHorzWidth = 2;
|
||||||
|
begin
|
||||||
|
if not fisBackBlack then Exit;
|
||||||
|
|
||||||
|
fCaretVisible := not fCaretVisible ;
|
||||||
|
if not fCaretVisible then Exit;
|
||||||
|
|
||||||
|
obj := HITextViewGetTXNObject(Widget);
|
||||||
|
if not Assigned(obj) then Exit;
|
||||||
|
|
||||||
|
TXNGetSelection(obj, pst, pend);
|
||||||
|
if TXNOffsetToHIPoint(obj, pst, point) <> noErr then Exit;
|
||||||
|
|
||||||
|
// getting current line-height, anyone knows a better way?
|
||||||
|
CreateEvent(kCFAllocatorDefault, kEventClassTextInput, kEventTextInputOffsetToPos, 0, 0, event);
|
||||||
|
ref := Widget;
|
||||||
|
refcon := 0;
|
||||||
|
SetEventParameter(event, kEventParamTextInputSendComponentInstance, typeControlRef, sizeof(Widget), ref);
|
||||||
|
SetEventParameter(event, kEventParamTextInputSendRefCon, typeLongInteger, sizeof(refcon), @refcon);
|
||||||
|
SetEventParameter(event, kEventParamTextInputSendTextOffset, typeLongInteger, sizeof(pst), @pst);
|
||||||
|
SendEventToEventTarget(event, target);
|
||||||
|
GetEventParameter(event, kEventParamTextInputReplyLineHeight, typeShortInteger, nil, sizeof(hh), nil, @hh);
|
||||||
|
CFRelease(event);
|
||||||
|
|
||||||
|
point.x := point.x-caretHorzOffset;
|
||||||
|
r.origin := point;
|
||||||
|
r.size.width:=caretHorzWidth;
|
||||||
|
r.size.height:=hh;
|
||||||
|
|
||||||
|
CGContextSetRGBFillColor(aContext, 1,1,1,1);
|
||||||
|
CGContextFillRect(aContext, r);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CarbonRichEdit_Draw(ANextHandler: EventHandlerCallRef;
|
||||||
|
AEvent: EventRef;
|
||||||
|
AWidget: TCarbonWidget): OSStatus; {$IFDEF darwin}mwpascal;{$ENDIF}
|
||||||
|
var
|
||||||
|
context : CGContextRef;
|
||||||
|
begin
|
||||||
|
Result := CallNextEventHandler(ANextHandler, AEvent);
|
||||||
|
if Assigned(AWidget) then
|
||||||
|
begin
|
||||||
|
GetEventParameter(AEvent, kEventParamCGContextRef, typeCGContextRef, nil, sizeof(context), nil, @context);
|
||||||
|
if not Assigned(context) then Exit;
|
||||||
|
TCarbonRichEdit(AWidget).PostDraw(context);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCarbonRichEdit.RegisterEvents;
|
||||||
|
var
|
||||||
|
TmpSpec: EventTypeSpec;
|
||||||
|
begin
|
||||||
|
inherited RegisterEvents;
|
||||||
|
|
||||||
|
if GetEditPart >= 0 then
|
||||||
|
begin
|
||||||
|
TmpSpec := MakeEventSpec(kEventClassControl, kEventControlDraw);
|
||||||
|
InstallControlEventHandler(Widget,
|
||||||
|
RegisterEventHandler(@CarbonRichEdit_Draw),
|
||||||
|
1, @TmpSpec, Pointer(Self), nil);
|
||||||
|
end;
|
||||||
|
|
||||||
|
target :=HIViewGetEventTarget(Widget);
|
||||||
|
end;
|
||||||
|
|
||||||
function TCarbonRichEdit.GetIndexedRunInfoFromRange(iIndex: ItemCount;
|
function TCarbonRichEdit.GetIndexedRunInfoFromRange(iIndex: ItemCount;
|
||||||
iStartOffset, iEndOffset: TXNOffset;
|
iStartOffset, iEndOffset: TXNOffset;
|
||||||
var oRunStartOffset, oRunEndOffset: TXNOffset;
|
var oRunStartOffset, oRunEndOffset: TXNOffset;
|
||||||
@@ -430,6 +520,12 @@ begin
|
|||||||
@iTypeAttributes[0], StartOffset, EndOffset) = noErr;
|
@iTypeAttributes[0], StartOffset, EndOffset) = noErr;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCarbonRichEdit.SetColor(const AColor: TColor);
|
||||||
|
begin
|
||||||
|
fisBackBlack := AColor = clBlack;
|
||||||
|
inherited SetColor(AColor);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCarbonRichEdit.InDelText(const text: WideString; replstart, repllength: Integer);
|
procedure TCarbonRichEdit.InDelText(const text: WideString; replstart, repllength: Integer);
|
||||||
var
|
var
|
||||||
data : UnivPtr;
|
data : UnivPtr;
|
||||||
@@ -447,11 +543,7 @@ begin
|
|||||||
if repllength < 0 then replend := kTXNEndOffset
|
if repllength < 0 then replend := kTXNEndOffset
|
||||||
else replend := replstart+repllength;
|
else replend := replstart+repllength;
|
||||||
res := TXNSetData(HITextViewGetTXNObject(Widget), kTXNUnicodeTextData, data, datasz, replstart, replend);
|
res := TXNSetData(HITextViewGetTXNObject(Widget), kTXNUnicodeTextData, data, datasz, replstart, replend);
|
||||||
writeln('TXNSetData ', res);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user