diff --git a/components/richmemo/richmemo.pas b/components/richmemo/richmemo.pas index fc9b45cd2..33b4e3435 100644 --- a/components/richmemo/richmemo.pas +++ b/components/richmemo/richmemo.pas @@ -24,19 +24,38 @@ unit RichMemo; interface uses - Classes, SysUtils, Graphics, StdCtrls, - WSRichMemo; + Classes, SysUtils, Graphics, StdCtrls; type + TFontParams = record + Name : String; + Size : Integer; + Color : TColor; + Style : TFontStyles; + end; - TFontParams = WSRichMemo.TIntFontParams; TParaAlignment = (paLeft, paRight, paCenter, paJustify); - TParaMetric = WSRichMemo.TIntParaMetric; - TParaNumStyle = WSRichMemo.TParaNumStyle; - TParaNumbering = WSRichMemo.TIntParaNumbering; + TParaMetric = record + FirstLine : Double; // in points + TailIndent : Double; // in points + HeadIndent : Double; // in points + SpaceBefore : Double; // in points + SpaceAfter : Double; // in points + LineSpacing : Double; // multi + end; + TParaNumStyle = (pnNone, pnBullet, pnNumber, pnLowLetter + , pnLowRoman, pnUpLetter, pnUpRoman, pnCustomChar); + + TParaNumbering = record + Numbering : TParaNumStyle; + NumCustom : WideChar; + NumIndent : Double; + end; TTextModifyMask = set of (tmm_Color, tmm_Name, tmm_Size, tmm_Styles); + TRichMemoObject = class(TObject); + { TCustomRichMemo } TCustomRichMemo = class(TCustomMemo) @@ -134,20 +153,29 @@ type property WantTabs; property WordWrap; end; - + +procedure InitFontParams(var p: TFontParams); function GetFontParams(styles: TFontStyles): TFontParams; overload; function GetFontParams(color: TColor; styles: TFontStyles): TFontParams; overload; function GetFontParams(const Name: String; color: TColor; styles: TFontStyles): TFontParams; overload; function GetFontParams(const Name: String; Size: Integer; color: TColor; styles: TFontStyles): TFontParams; overload; +procedure InitParaMatric(var m: TParaMetric); +procedure InitParaNumbering(var n: TParaNumbering); + var RTFLoadStream : function (AMemo: TCustomRichMemo; Source: TStream): Boolean = nil; RTFSaveStream : function (AMemo: TCustomRichMemo; Dest: TStream): Boolean = nil; implementation -const - ParaAlignCode : array [TParaAlignment] of Integer = (AL_LEFT, AL_RIGHT, AL_CENTER, AL_JUSTIFY); +uses + WSRichMemo; + +procedure InitFontParams(var p: TFontParams); +begin + FillChar(p, SizeOf(p), 0); +end; function GetFontParams(styles: TFontStyles): TFontParams; overload; begin @@ -166,12 +194,23 @@ end; function GetFontParams(const Name: String; Size: Integer; color: TColor; styles: TFontStyles): TFontParams; overload; begin + InitFontParams(Result); Result.Name := Name; Result.Size := Size; Result.Color := color; Result.Style := styles; end; +procedure InitParaMatric(var m: TParaMetric); +begin + FillChar(m, sizeof(m), 0); +end; + +procedure InitParaNumbering(var n: TParaNumbering); +begin + FillChar(n, sizeof(n), 0); +end; + { TCustomRichMemo } procedure TCustomRichMemo.SetHideSelection(AValue: Boolean); @@ -247,24 +286,14 @@ var ac: Integer; begin Result := HandleAllocated and - TWSCustomRichMemoClass(WidgetSetClass).GetParaAlignment(Self, TextStart, ac); - if Result then begin - case ac of - AL_LEFT: AAlign:=paLeft; - AL_RIGHT: AAlign:=paRight; - AL_CENTER: AAlign:=paCenter; - AL_JUSTIFY: AAlign:=paJustify - else - AAlign:=paLeft; - end; - end; + TWSCustomRichMemoClass(WidgetSetClass).GetParaAlignment(Self, TextStart, AAlign); end; procedure TCustomRichMemo.SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment); begin if HandleAllocated then - TWSCustomRichMemoClass(WidgetSetClass).SetParaAlignment(Self, TextStart, TextLen, ParaAlignCode[AAlign]); + TWSCustomRichMemoClass(WidgetSetClass).SetParaAlignment(Self, TextStart, TextLen, AAlign); end; function TCustomRichMemo.GetParaMetric(TextStart: Integer; @@ -378,7 +407,6 @@ begin end; end; - function TCustomRichMemo.LoadRichText(Source: TStream): Boolean; begin Result:=false; diff --git a/components/richmemo/win32/win32richmemo.pas b/components/richmemo/win32/win32richmemo.pas index e99145054..aa7289844 100644 --- a/components/richmemo/win32/win32richmemo.pas +++ b/components/richmemo/win32/win32richmemo.pas @@ -34,7 +34,7 @@ uses // Win32WidgetSet Win32WSControls, Win32Int, // RichMemo headers - WSRichMemo, Win32RichMemoProc; + RichMemo, WSRichMemo, Win32RichMemoProc; type @@ -62,9 +62,9 @@ type class function SaveRichText(const AWinControl: TWinControl; Dst: TStream): Boolean; override; class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer; - var AAlign: Integer): Boolean; override; + var AAlign: TParaAlignment): Boolean; override; class procedure SetParaAlignment(const AWinControl: TWinControl; TextStart, TextLen: Integer; - const AAlign: Integer); override; + const AAlign: TIntParaAlignment); override; class function GetParaMetric(const AWinControl: TWinControl; TextStart: Integer; var AMetrics: TIntParaMetric): Boolean; override; @@ -346,7 +346,7 @@ begin end; class function TWin32WSCustomRichMemo.GetParaAlignment( - const AWinControl: TWinControl; TextStart: Integer; var AAlign: Integer + const AWinControl: TWinControl; TextStart: Integer; var AAlign: TParaAlignment ): Boolean; var para : PARAFORMAT2; @@ -355,28 +355,27 @@ begin if not Assigned(RichEditManager) or not Assigned(AWinControl) then Exit; RichEditManager.GetPara2(AWinControl.Handle, TextStart, para); case para.wAlignment of - PFA_CENTER: AAlign:=AL_CENTER; - PFA_RIGHT: AAlign:=AL_RIGHT; - PFA_JUSTIFY: AAlign:=AL_JUSTIFY; + PFA_CENTER: AAlign:=paCenter; + PFA_RIGHT: AAlign:=paRight; + PFA_JUSTIFY: AAlign:=paJustify; else - AAlign:=AL_LEFT; + AAlign:=paLeft; end; Result:=true; end; class procedure TWin32WSCustomRichMemo.SetParaAlignment( - const AWinControl: TWinControl; TextStart, TextLen: Integer; const AAlign: Integer); + const AWinControl: TWinControl; TextStart, TextLen: Integer; const AAlign: TIntParaAlignment); var para : PARAFORMAT2; const - WinPara : array [AL_LEFT..AL_JUSTIFY] of word = (PFA_LEFT, PFA_RIGHT, PFA_CENTER, PFA_JUSTIFY); + WinPara : array [TIntParaAlignment] of word = (PFA_LEFT, PFA_RIGHT, PFA_CENTER, PFA_JUSTIFY); begin - if not Assigned(RichEditManager) or not Assigned(AWinControl) - or (AAlignAL_JUSTIFY) then Exit; + if not Assigned(RichEditManager) or not Assigned(AWinControl) then Exit; FillChar(para, sizeof(para), 0); para.cbSize:=sizeof(para); para.dwMask:=PFM_ALIGNMENT; - para.wAlignment:=WinPara[byte(AAlign)]; + para.wAlignment:=WinPara[AAlign]; RichEditManager.SetPara2(AWinControl.Handle, TextStart, TextLen, para); end; diff --git a/components/richmemo/win32/win32richmemoproc.pas b/components/richmemo/win32/win32richmemoproc.pas index 90b14bebb..21c09661b 100644 --- a/components/richmemo/win32/win32richmemoproc.pas +++ b/components/richmemo/win32/win32richmemoproc.pas @@ -33,8 +33,77 @@ uses // RichMemoUnits WSRichMemo, // Win32 widgetset units - win32proc; - + win32proc + ,ActiveX, ComObj; + +const + IID_IRichEditOle: TGUID = '{00020D00-0000-0000-C000-000000000046}'; + IID_IRichEditOleCallback: TGUID = '{00020D03-0000-0000-C000-000000000046}'; + +type + TREOBJECT = packed record + cbStruct : DWORD; + cp : LONG; + clsid : CLSID; + poleobj : IOLEOBJECT; + pstg : ISTORAGE; + polesite : IOLECLIENTSITE; + sizel : SIZEL; + dvaspect : DWORD; + dwFlags : DWORD; + dwUser : DWORD; + end; + +type + IRichEditOle = interface(IUnknown) + ['{00020D00-0000-0000-C000-000000000046}'] + // *** IRichEditOle methods *** + function GetClientSite(out clientSite: IOleClientSite): HRESULT; stdcall; + function GetObjectCount: LongInt; stdcall; + function GetLinkCount: LongInt; stdcall; + function GetObject(iob: LongInt; out ReObject: TReObject; + dwFlags: DWORD): HRESULT; stdcall; + function InsertObject(var ReObject: TReObject): HRESULT; stdcall; + function ConvertObject(iob: LongInt; const clsidNew: TCLSID; + lpStrUserTypeNew: LPCSTR): HRESULT; stdcall; + function ActivateAs(const clsid, clsidAs: TCLSID): HRESULT; stdcall; + function SetHostNames(lpstrContainerApp: LPCSTR; + lpstrContainerObj: LPCSTR): HRESULT; stdcall; + function SetLinkAvailable(iob: LongInt; fAvailable: BOOL): HRESULT; stdcall; + function SetDvaspect(iob: LongInt; dvaspect: DWORD): HRESULT; stdcall; + function HandsOffStorage(iob: LongInt): HRESULT; stdcall; + function SaveCompleted(iob: LongInt; const stg: IStorage): HRESULT; stdcall; + function InPlaceDeactivate: HRESULT; stdcall; + function ContextSensitiveHelp(fEnterMode: BOOL): HRESULT; stdcall; + function GetClipboardData(const chrg: TCharRange; reco: DWORD; + out dataobj: IDataObject): HRESULT; stdcall; + function ImportDataObject(const dataobj: IDataObject; cf: TClipFormat; + hMetaPict: HGLOBAL): HRESULT; stdcall; + end; + + IRichEditOleCallback = interface(IUnknown) + ['{00020D03-0000-0000-C000-000000000046}'] + // *** IRichEditOleCallback methods *** + function GetNewStorage(out stg: IStorage): HRESULT; stdcall; + function GetInPlaceContext(out Frame: IOleInPlaceFrame; + out Doc: IOleInPlaceUIWindow; + lpFrameInfo: POleInPlaceFrameInfo): HRESULT; stdcall; + function ShowContainerUI(fShow: BOOL): HRESULT; stdcall; + function QueryInsertObject(const clsid: TCLSID; const stg: IStorage; + cp: LongInt): HRESULT; stdcall; + function DeleteObject(const oleobj: IOleObject): HRESULT; stdcall; + function QueryAcceptData(const dataobj: IDataObject; + var cfFormat: TClipFormat; reco: DWORD; fReally: BOOL; + hMetaPict: HGLOBAL): HRESULT; stdcall; + function ContextSensitiveHelp(fEnterMode: BOOL): HRESULT; stdcall; + function GetClipboardData(const chrg: TCharRange; reco: DWORD; + out dataobj: IDataObject): HRESULT; stdcall; + function GetDragDropEffect(fDrag: BOOL; grfKeyState: DWORD; + var dwEffect: DWORD): HRESULT; stdcall; + function GetContextMenu(seltype: Word; oleobj: IOleObject; + const chrg: TCharRange; var menu: HMENU): HRESULT; stdcall; + end; + type { TRichEditManager } diff --git a/components/richmemo/wsrichmemo.pas b/components/richmemo/wsrichmemo.pas index 413903ac6..8884f285f 100644 --- a/components/richmemo/wsrichmemo.pas +++ b/components/richmemo/wsrichmemo.pas @@ -25,44 +25,16 @@ interface uses Classes, SysUtils, - Graphics, Controls, StdCtrls, - - WSStdCtrls; - -type - - TIntFontParams = record - Name : String; - Size : Integer; - Color : TColor; - Style : TFontStyles; - end; - -const - AL_LEFT = 1; - AL_RIGHT = 2; - AL_CENTER = 3; - AL_JUSTIFY = 4; + WSStdCtrls, RichMemo; type - TIntParaMetric = record - FirstLine : Double; // in points - TailIndent : Double; // in points - HeadIndent : Double; // in points - SpaceBefore : Double; // in points - SpaceAfter : Double; // in points - LineSpacing : Double; // todo: ? - end; + TIntParaAlignment = RichMemo.TParaAlignment; + TIntFontParams = RichMemo.TFontParams; - TParaNumStyle = (pnNone, pnBullet, pnNumber, pnLowLetter - , pnLowRoman, pnUpLetter, pnUpRoman, pnCustomChar); - - TIntParaNumbering = record - Numbering : TParaNumStyle; - NumCustom : WideChar; - NumIndent : Double; - end; +type + TIntParaMetric = RichMemo.TParaMetric; + TIntParaNumbering = RichMemo.TParaNumbering; TTabAlignment = (taLeft, taCenter, taRight, taDecimal, taWordBar); @@ -76,7 +48,6 @@ type Tabs : array of TTabInfo; end; - { TWSCustomRichMemo } TWSCustomRichMemo = class(TWSCustomMemo) @@ -94,9 +65,9 @@ type class procedure SetTextAttributes(const AWinControl: TWinControl; TextStart, TextLen: Integer; const Params: TIntFontParams); virtual; class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer; - var AAlign: Integer): Boolean; virtual; + var AAlign: TIntParaAlignment): Boolean; virtual; class procedure SetParaAlignment(const AWinControl: TWinControl; TextStart, TextLen: Integer; - const AAlign: Integer); virtual; + const AAlign: TIntParaAlignment); virtual; class function GetParaMetric(const AWinControl: TWinControl; TextStart: Integer; var AMetric: TIntParaMetric): Boolean; virtual; class procedure SetParaMetric(const AWinControl: TWinControl; TextStart, TextLen: Integer; @@ -155,14 +126,15 @@ begin end; class function TWSCustomRichMemo.GetParaAlignment( - const AWinControl: TWinControl; TextStart: Integer; var AAlign: Integer - ): Boolean; + const AWinControl: TWinControl; TextStart: Integer; + var AAlign: TIntParaAlignment): Boolean; begin Result := false; end; class procedure TWSCustomRichMemo.SetParaAlignment( - const AWinControl: TWinControl; TextStart, TextLen: Integer; const AAlign: Integer); + const AWinControl: TWinControl; TextStart, TextLen: Integer; + const AAlign: TIntParaAlignment); begin end;