diff --git a/components/richmemo/richmemo.pas b/components/richmemo/richmemo.pas index 4523deb4a..a937621ac 100644 --- a/components/richmemo/richmemo.pas +++ b/components/richmemo/richmemo.pas @@ -53,7 +53,12 @@ type function GetContStyleLength(TextStart: Integer): Integer; procedure SetSelText(const SelTextUTF8: string); override; + public + procedure CopyToClipboard; override; + procedure CutToClipboard; override; + procedure PasteFromClipboard; override; + procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams); virtual; function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual; function GetStyleRange(CharOfs: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual; @@ -248,6 +253,24 @@ begin end; end; +procedure TCustomRichMemo.CopyToClipboard; +begin + if HandleAllocated then + TWSCustomRichMemoClass(WidgetSetClass).CopyToClipboard(Self); +end; + +procedure TCustomRichMemo.CutToClipboard; +begin + if HandleAllocated then + TWSCustomRichMemoClass(WidgetSetClass).CutToClipboard(Self); +end; + +procedure TCustomRichMemo.PasteFromClipboard; +begin + if HandleAllocated then + TWSCustomRichMemoClass(WidgetSetClass).PasteFromClipboard(Self); +end; + procedure TCustomRichMemo.SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor); begin SetRangeParams(TextStart, TextLength, [tmm_Color], '', 0, FontColor, [], []); diff --git a/components/richmemo/win32/win32richmemo.pas b/components/richmemo/win32/win32richmemo.pas index e28a08188..74bcd350e 100644 --- a/components/richmemo/win32/win32richmemo.pas +++ b/components/richmemo/win32/win32richmemo.pas @@ -46,13 +46,17 @@ type class procedure SetSelStart(const ACustomEdit: TCustomEdit; NewStart: integer); override; class procedure SetSelLength(const ACustomEdit: TCustomEdit; NewLength: integer); override; + + class procedure CutToClipboard(const AWinControl: TWinControl); override; + class procedure CopyToClipboard(const AWinControl: TWinControl); override; + class procedure PasteFromClipboard(const AWinControl: TWinControl); override; class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; 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 procedure SetHideSelection(const AWinControl: TWinControl; AHideSelection: Boolean); override; + class procedure SetHideSelection(const ACustomEdit: TCustomEdit; AHideSelection: Boolean); override; class function GetStyleRange(const AWinControl: TWinControl; TextStart: Integer; var RangeStart, RangeLen: Integer): Boolean; override; class function LoadRichText(const AWinControl: TWinControl; Source: TStream): Boolean; override; class function SaveRichText(const AWinControl: TWinControl; Dst: TStream): Boolean; override; @@ -121,6 +125,21 @@ begin InvalidateRect(ACustomEdit.Handle, nil, false); end; +class procedure TWin32WSCustomRichMemo.CutToClipboard(const AWinControl: TWinControl); +begin + SendMessage(AWinControl.Handle, WM_CUT, 0,0); +end; + +class procedure TWin32WSCustomRichMemo.CopyToClipboard(const AWinControl: TWinControl); +begin + SendMessage(AWinControl.Handle, WM_COPY, 0,0); +end; + +class procedure TWin32WSCustomRichMemo.PasteFromClipboard(const AWinControl: TWinControl); +begin + SendMessage(AWinControl.Handle, WM_PASTE, 0,0); +end; + class function TWin32WSCustomRichMemo.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND; var @@ -239,10 +258,10 @@ end; class procedure TWin32WSCustomRichMemo.SetHideSelection( - const AWinControl: TWinControl; AHideSelection: Boolean); + const ACustomEdit: TCustomEdit; AHideSelection: Boolean); begin - if not Assigned(RichEditManager) or not Assigned(AWinControl) then Exit; - RichEditManager.SetHideSelection(AWinControl.Handle, AHideSelection); + if not Assigned(RichEditManager) or not Assigned(ACustomEdit) then Exit; + RichEditManager.SetHideSelection(ACustomEdit.Handle, AHideSelection); end; procedure InitScrollInfo(var info: TScrollInfo); diff --git a/components/richmemo/win32/win32richmemoproc.pas b/components/richmemo/win32/win32richmemoproc.pas index b65ea5708..a6a189556 100644 --- a/components/richmemo/win32/win32richmemoproc.pas +++ b/components/richmemo/win32/win32richmemoproc.pas @@ -65,7 +65,7 @@ implementation const GlobalRichClass : AnsiString = ''; -const +const TwipsInFontSize = 20; // see MSDN for CHARFORMAT Structure CFM_SIZE function GetRichEditClass: AnsiString; @@ -184,11 +184,11 @@ begin end; type - gettextlengthex = packed record + richedit_gettextlengthex = packed record flags : DWORD; codepage : LongWord; end; - Tgettextlengthex = gettextlengthex; + Tgettextlengthex = richedit_gettextlengthex; class function TRichEditManager.GetStyleRange(RichEditWnd: Handle; TextStart: Integer; var RangeStart, RangeLen: Integer): Boolean; @@ -206,11 +206,13 @@ const CFM_SIZE or CFM_COLOR or CFM_FACE; begin Result := false; - if RichEditWnd = 0 then Exit; + if (RichEditWnd = 0) then Exit; textlen.flags := GTL_NUMCHARS or GTL_USECRLF or GTL_PRECISE; textlen.codepage := CP_UNICODE; len := SendMessage(RichEditWnd, EM_GETTEXTLENGTHEX, WPARAM(@textlen), 0); + Result := TextStart < len; + if not Result then Exit; FillChar(fmt, sizeof(fmt), 0); fmt.cbSize := sizeof(fmt); diff --git a/components/richmemo/wsrichmemo.pas b/components/richmemo/wsrichmemo.pas index 073eaba11..63a3da4d6 100644 --- a/components/richmemo/wsrichmemo.pas +++ b/components/richmemo/wsrichmemo.pas @@ -26,9 +26,9 @@ interface uses Classes, SysUtils, - Graphics, Controls, + Graphics, Controls, StdCtrls, - WSStdCtrls; + WSStdCtrls; type @@ -44,13 +44,20 @@ type TWSCustomRichMemo = class(TWSCustomMemo) published + //Note: RichMemo cannot use LCL TCustomEdit copy/paste/cut operations + // because there's no support for (system native) RICHTEXT clipboard format + // that's why Clipboard operations are moved to widgetset level + class procedure CutToClipboard(const AWinControl: TWinControl); virtual; + class procedure CopyToClipboard(const AWinControl: TWinControl); virtual; + class procedure PasteFromClipboard(const AWinControl: TWinControl); virtual; + class function GetStyleRange(const AWinControl: TWinControl; TextStart: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual; class function GetTextAttributes(const AWinControl: TWinControl; TextStart: Integer; var Params: TIntFontParams): Boolean; virtual; class procedure SetTextAttributes(const AWinControl: TWinControl; TextStart, TextLen: Integer; const Params: TIntFontParams); virtual; class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); virtual; - class procedure SetHideSelection(const AWinControl: TWinControl; AHideSelection: Boolean); virtual; + class procedure SetHideSelection(const ACustomEdit: TCustomEdit; AHideSelection: Boolean); override; class function LoadRichText(const AWinControl: TWinControl; Source: TStream): Boolean; virtual; class function SaveRichText(const AWinControl: TWinControl; Dest: TStream): Boolean; virtual; end; @@ -63,6 +70,21 @@ implementation { TWSCustomRichMemo } +class procedure TWSCustomRichMemo.CutToClipboard(const AWinControl: TWinControl); +begin + +end; + +class procedure TWSCustomRichMemo.CopyToClipboard(const AWinControl: TWinControl); +begin + +end; + +class procedure TWSCustomRichMemo.PasteFromClipboard(const AWinControl: TWinControl); +begin + +end; + class function TWSCustomRichMemo.GetStyleRange(const AWinControl: TWinControl; TextStart: Integer; var RangeStart, RangeLen: Integer): Boolean; begin @@ -88,7 +110,7 @@ begin end; -class procedure TWSCustomRichMemo.SetHideSelection(const AWinControl: TWinControl; AHideSelection: Boolean); +class procedure TWSCustomRichMemo.SetHideSelection(const ACustomEdit: TCustomEdit; AHideSelection: Boolean); begin end;