You've already forked lazarus-ccr
aarre
applications
bindings
components
Comba_Animation
aboutcomponent
acs
beepfp
callite
chelper
chemtext
cmdline
cmdlinecfg
colorpalette
cryptini
csvdocument
epiktimer
extrasyn
fpexif
fpsound
fpspreadsheet
fractions
freetypepascal
geckoport
gradcontrols
grid_semaphor
industrialstuff
iosdesigner
iphonelazext
jujiboutils
jvcllaz
kcontrols
lazautoupdate
lazbarcodes
lazmapviewer
lclextensions
longtimer
manualdock
mbColorLib
mplayer
multithreadprocs
nvidia-widgets
onguard
orpheus
playsoundpackage
poweredby
powerpdf
rgbgraphics
richmemo
carbon
cocoa
gtk2
ide
qt
qt5
qt5richmemo.pas
samples
win32
richmemo.pas
richmemofactory.pas
richmemohelpers.pas
richmemopackage.lpk
richmemopackage.lrs
richmemopackage.pas
richmemoregister.pas
richmemortf.pas
richmemoutils.pas
rtfdata.inc
rtfparspre211.pas
wsrichmemo.pas
richview
rtfview
rx
scrolltext
smnetgradient
spktoolbar
svn
systools
tdi
thtmlport
tparadoxdataset
tvplanit
xdev_toolkit
zlibar
zmsql
examples
image_sources
lclbindings
wst
246 lines
6.8 KiB
ObjectPascal
246 lines
6.8 KiB
ObjectPascal
![]() |
unit qt5richmemo;
|
||
|
|
||
|
interface
|
||
|
|
||
|
{$mode delphi}
|
||
|
|
||
|
//
|
||
|
// Following class methods are need for the implementation
|
||
|
// QTextCharFormatH
|
||
|
// QTextBlockFormatH
|
||
|
uses
|
||
|
LCLType, Controls, StdCtrls, Graphics,
|
||
|
qt5, qtobjects, qtwidgets, qtprivate,
|
||
|
WSProc,
|
||
|
RichMemo, WSRichMemo;
|
||
|
|
||
|
type
|
||
|
{ TQtWSCustomRichMemo }
|
||
|
|
||
|
TQtWSCustomRichMemo = class(TWSCustomRichMemo)
|
||
|
published
|
||
|
class function CreateHandle(const AWinControl: TWinControl;
|
||
|
const AParams: TCreateParams): HWND; override;
|
||
|
class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer;
|
||
|
var AAlign: TIntParaAlignment): Boolean; override;
|
||
|
class procedure SetParaAlignment(const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||
|
const AAlign: TIntParaAlignment); override;
|
||
|
class function GetTextAttributes(const AWinControl: TWinControl; TextStart: Integer;
|
||
|
var Params: TIntFontParams): Boolean; override;
|
||
|
class procedure SetTextAttributes(const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||
|
const Params: TIntFontParams); override;
|
||
|
|
||
|
class function Search(const AWinControl: TWinControl; const ANiddle: string; const SearchOpts: TIntSearchOpt): Integer; override;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
const
|
||
|
WordWrapMap: array[Boolean] of QTextEditLineWrapMode =
|
||
|
(
|
||
|
QTextEditNoWrap,
|
||
|
QTextEditWidgetWidth
|
||
|
);
|
||
|
|
||
|
AlignmentMap: array[TIntParaAlignment] of QtAlignment =
|
||
|
(
|
||
|
QtAlignLeft,
|
||
|
QtAlignRight,
|
||
|
QtAlignHCenter,
|
||
|
QtAlignJustify
|
||
|
);
|
||
|
|
||
|
{ TQtWSCustomRichMemo }
|
||
|
|
||
|
class function TQtWSCustomRichMemo.CreateHandle(const AWinControl: TWinControl;
|
||
|
const AParams: TCreateParams): HWND;
|
||
|
var
|
||
|
QtTextEdit: TQtTextEdit;
|
||
|
begin
|
||
|
QtTextEdit := TQtTextEdit.Create(AWinControl, AParams);
|
||
|
QtTextEdit.AcceptRichText := True;
|
||
|
QtTextEdit.ClearText;
|
||
|
QtTextEdit.setBorder(TCustomMemo(AWinControl).BorderStyle = bsSingle);
|
||
|
QtTextEdit.setReadOnly(TCustomMemo(AWinControl).ReadOnly);
|
||
|
QtTextEdit.setLineWrapMode(WordWrapMap[TCustomMemo(AWinControl).WordWrap]);
|
||
|
// create our FList helper
|
||
|
QtTextEdit.FList := TQtMemoStrings.Create(TCustomMemo(AWinControl));
|
||
|
QtTextEdit.setScrollStyle(TCustomMemo(AWinControl).ScrollBars);
|
||
|
QtTextEdit.setTabChangesFocus(not TCustomMemo(AWinControl).WantTabs);
|
||
|
QtTextEdit.AttachEvents;
|
||
|
|
||
|
Result := TLCLIntfHandle(QtTextEdit);
|
||
|
end;
|
||
|
|
||
|
class procedure TQtWSCustomRichMemo.SetParaAlignment(
|
||
|
const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||
|
const AAlign: TIntParaAlignment);
|
||
|
var
|
||
|
w : QTextEditH;
|
||
|
te : TQtTextEdit;
|
||
|
ss, sl : Integer;
|
||
|
begin
|
||
|
if not WSCheckHandleAllocated(AWinControl, 'SetParaAlignment') then
|
||
|
Exit;
|
||
|
te:=TQtTextEdit(AWinControl.Handle);
|
||
|
w:=QTextEditH(te.Widget);
|
||
|
|
||
|
ss:=te.getSelectionStart;
|
||
|
sl:=te.getSelectionLength;
|
||
|
|
||
|
te.setSelection(TextStart, TextLen);
|
||
|
|
||
|
// alignment
|
||
|
QTextEdit_setAlignment(w, AlignmentMap[AAlign]);
|
||
|
|
||
|
te.setSelection(ss, sl);
|
||
|
end;
|
||
|
|
||
|
const
|
||
|
QNormal = 50;
|
||
|
QBold = 75;
|
||
|
|
||
|
class function TQtWSCustomRichMemo.GetTextAttributes(
|
||
|
const AWinControl: TWinControl; TextStart: Integer; var Params: TIntFontParams
|
||
|
): Boolean;
|
||
|
var
|
||
|
w : QTextEditH;
|
||
|
te : TQtTextEdit;
|
||
|
ss, sl : Integer;
|
||
|
ws : WideString;
|
||
|
clr: TQColor;
|
||
|
begin
|
||
|
InitFontParams(Params);
|
||
|
if not WSCheckHandleAllocated(AWinControl, 'GetTextAttributes') then begin
|
||
|
Result:=false;
|
||
|
Exit;
|
||
|
end;
|
||
|
|
||
|
te:=TQtTextEdit(AWinControl.Handle);
|
||
|
w:=QTextEditH(te.Widget);
|
||
|
|
||
|
ss:=te.getSelectionStart;
|
||
|
sl:=te.getSelectionLength;
|
||
|
|
||
|
te.setSelection(TextStart, 1);
|
||
|
|
||
|
//todo!
|
||
|
ws:='';
|
||
|
QTextEdit_fontFamily(w, @ws);
|
||
|
writeln(wS);
|
||
|
if ws<>'' then Params.Name:=ws;
|
||
|
|
||
|
Params.Size:=round(QTextEdit_fontPointSize(w));
|
||
|
if QTextEdit_fontWeight(w)>=QBold then Include(Params.Style, fsBold);
|
||
|
if QTextEdit_fontItalic(w) then Include(Params.Style, fsItalic);
|
||
|
if QTextEdit_fontUnderline(w) then Include(Params.Style, fsUnderline);
|
||
|
|
||
|
FillChar(clr, sizeof(clr), 0);
|
||
|
QTextEdit_textColor(w, @clr);
|
||
|
TQColorToColorRef(clr, TColorRef(params.Color));
|
||
|
|
||
|
FillChar(clr, sizeof(clr), 0);
|
||
|
QTextEdit_textBackgroundColor(w, @clr);
|
||
|
TQColorToColorRef(clr, TColorRef(params.BkColor));
|
||
|
//todo!
|
||
|
params.HasBkClr:=false;
|
||
|
|
||
|
te.setSelection(ss, sl);
|
||
|
Result:=true;
|
||
|
end;
|
||
|
|
||
|
class procedure TQtWSCustomRichMemo.SetTextAttributes(
|
||
|
const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||
|
const Params: TIntFontParams);
|
||
|
var
|
||
|
w : QTextEditH;
|
||
|
te : TQtTextEdit;
|
||
|
ss, sl : Integer;
|
||
|
ws : WideString;
|
||
|
clr: TQColor;
|
||
|
const
|
||
|
QNormal = 50;
|
||
|
QBold = 75;
|
||
|
const
|
||
|
QIsBold: array [Boolean] of integer = (QNormal, QBold);
|
||
|
begin
|
||
|
if not WSCheckHandleAllocated(AWinControl, 'SetTextAttributes') then
|
||
|
Exit;
|
||
|
te:=TQtTextEdit(AWinControl.Handle);
|
||
|
w:=QTextEditH(te.Widget);
|
||
|
|
||
|
ss:=te.getSelectionStart;
|
||
|
sl:=te.getSelectionLength;
|
||
|
|
||
|
te.setSelection(TextStart, TextLen);
|
||
|
|
||
|
ws:=UTF8Decode(Params.Name);
|
||
|
if ws<>'' then QTextEdit_setFontFamily(w, @ws);
|
||
|
if Params.Size>0 then QTextEdit_setFontPointSize(w, Params.Size);
|
||
|
QTextEdit_setFontUnderline(w, fsUnderline in Params.Style);
|
||
|
QTextEdit_setFontWeight(w, QisBold[fsBold in Params.Style]);
|
||
|
QTextEdit_setFontItalic(w, fsItalic in Params.Style);
|
||
|
|
||
|
ColorRefToTQColor(Params.Color, clr);
|
||
|
QTextEdit_setTextColor(w, @clr);
|
||
|
|
||
|
//todo:
|
||
|
{
|
||
|
if not Params.HasBkClr then begin
|
||
|
ColorRefToTQColor(Params.BkColor, clr);
|
||
|
clr.Alpha:=0;
|
||
|
end else
|
||
|
ColorRefToTQColor(Params.BkColor, clr);
|
||
|
QTextEdit_setTextBackgroundColor(w, @clr);
|
||
|
}
|
||
|
|
||
|
te.setSelection(ss, sl);
|
||
|
end;
|
||
|
|
||
|
class function TQtWSCustomRichMemo.Search(const AWinControl: TWinControl;
|
||
|
const ANiddle: string; const SearchOpts: TIntSearchOpt): Integer;
|
||
|
var
|
||
|
w : QTextEditH;
|
||
|
te : TQtTextEdit;
|
||
|
ws : Widestring;
|
||
|
fl : QTextDocumentFindFlags;
|
||
|
begin
|
||
|
if not WSCheckHandleAllocated(AWinControl, 'SetParaAlignment') then
|
||
|
Exit;
|
||
|
te:=TQtTextEdit(AWinControl.Handle);
|
||
|
w:=QTextEditH(te.Widget);
|
||
|
|
||
|
fl:=0;
|
||
|
if soMatchCase in SearchOpts.Options then fl:=fl or QTextDocumentFindCaseSensitively;
|
||
|
if soWholeWord in SearchOpts.Options then fl:=fl or QTextDocumentFindWholeWords;
|
||
|
if soBackward in SearchOpts.Options then fl:=fl or QTextDocumentFindBackward;
|
||
|
|
||
|
//todo: range filtering in Serach Opts
|
||
|
ws:=UTF8Decode(ANiddle);
|
||
|
if QTextEdit_find(w, @ws, fl) then Result:=te.getSelectionStart
|
||
|
else Result:=-1;
|
||
|
end;
|
||
|
|
||
|
class function TQtWSCustomRichMemo.GetParaAlignment(
|
||
|
const AWinControl: TWinControl; TextStart: Integer;
|
||
|
var AAlign: TIntParaAlignment): Boolean;
|
||
|
var
|
||
|
te : TQtTextEdit;
|
||
|
al : QtAlignment;
|
||
|
begin
|
||
|
if not WSCheckHandleAllocated(AWinControl, 'GetParaAlignment') then begin
|
||
|
Result:=false;
|
||
|
Exit;
|
||
|
end;
|
||
|
te:=TQtTextEdit(AWinControl.Handle);
|
||
|
al:=QTextEdit_alignment(QTextEditH(te.Widget));
|
||
|
if QtAlignLeading and al > 0 then AAlign:=paLeft
|
||
|
else if QtAlignTrailing and al > 0 then AAlign:=paRight
|
||
|
else if QtAlignCenter and al > 0 then AAlign:=paCenter
|
||
|
else if QtAlignJustify and al > 0 then AAlign:=paJustify
|
||
|
else AAlign:=paLeft;
|
||
|
Result:=true;
|
||
|
end;
|
||
|
|
||
|
end.
|