📄 jvrichedit.pas
字号:
procedure Done; override;
function Retry: Boolean; override;
function ConvertRead(Buffer: PChar; BufSize: Integer): Integer; override;
function ConvertWrite(Buffer: PChar; BufSize: Integer): Integer; override;
property Stream: TStream read FStream;
end;
TJvTextConversion = class(TJvStreamConversion)
public
function CanHandle(const AExtension: string; const AKind: TJvConversionKind): Boolean; override;
function Filter: string; override;
function TextKind: TJvConversionTextKind; override;
end;
TJvRTFConversion = class(TJvStreamConversion)
public
function CanHandle(const AExtension: string; const AKind: TJvConversionKind): Boolean; override;
function Filter: string; override;
function TextKind: TJvConversionTextKind; override;
function IsFormatCorrect(const AFileName: string): Boolean; override;
function IsFormatCorrect(AStream: TStream): Boolean; override;
end;
TJvOEMConversion = class(TJvStreamConversion)
public
function ConvertRead(Buffer: PChar; BufSize: Integer): Integer; override;
function ConvertWrite(Buffer: PChar; BufSize: Integer): Integer; override;
function TextKind: TJvConversionTextKind; override;
end;
FCE = Smallint; // File Conversion Error
{ typedef long (PASCAL *PFN_RTF)(long, long); }
PFN_RTF = function(I1, I2: Longint): Longint; stdcall;
{ long PASCAL InitConverter32(HANDLE hWnd, char *szModule); }
TInitConverter32 = function(hWnd: THandle; szModule: PChar): LongBool; stdcall;
{ void PASCAL UninitConverter(void); }
TUninitConverter = procedure; stdcall;
{ void PASCAL GetReadNames(HANDLE haszClass, HANDLE haszDescrip, HANDLE haszExt); }
TGetReadNames = procedure(haszClass, haszDescrip, haszExt: THandle); stdcall;
{ void PASCAL GetWriteNames(HANDLE haszClass, HANDLE haszDescrip, HANDLE haszExt); }
TGetWriteNames = procedure(haszClass, haszDescrip, haszExt: THandle); stdcall;
{ HGLOBAL PASCAL RegisterApp(unsigned long lFlags, void FAR *lpFuture); }
TRegisterApp = function(lFlags: DWORD; lpFuture: Pointer): HGLOBAL; stdcall;
{ FCE PASCAL IsFormatCorrect32(HANDLE ghszFile, HANDLE ghszClass); }
TIsFormatCorrect32 = function(ghszFile, ghszClass: THandle): FCE; stdcall;
{ FCE PASCAL ForeignToRtf32(HANDLE ghszFile, void *pstgForeign, HANDLE ghBuff, HANDLE ghszClass, HANDLE ghszSubset, PFN_RTF lpfnOut); }
TForeignToRtf32 = function(ghszFile: THandle; pstgForeign: Pointer; ghBuff, ghszClass, ghszSubset: THandle;
lpfnOut: PFN_RTF): FCE; stdcall;
{ FCE PASCAL RtfToForeign32(HANDLE ghszFile, void *pstgForeign, HANDLE ghBuff, HANDLE ghshClass, PFN_RTF lpfnIn); }
TRtfToForeign32 = function(ghszFile: THandle; pstgForeign: Pointer; ghBuff, ghshClass: THandle;
lpfnIn: PFN_RTF): FCE; stdcall;
{ long PASCAL CchFetchLpszError(long fce, char FAR *lpszError, long cb); }
TCchFetchLpszError = function(fce: Longint; lpszError: PChar; cb: Longint): Longint stdcall;
{ long PASCAL FRegisterConverter(HANDLE hkeyRoot); }
TFRegisterConverter = function(hkeyRoot: THandle): Longint; stdcall;
TJvMSTextConversion = class(TJvConversion)
private
FConverterFileName: string;
FExtensions: TStringList;
FDescription: string;
FConverterKind: TJvConversionKind;
FConverter: HMODULE;
FInitConverter32: TInitConverter32;
FUninitConverter: TUninitConverter;
FIsFormatCorrect32: TIsFormatCorrect32;
FForeignToRtf32: TForeignToRtf32;
FRtfToForeign32: TRtfToForeign32;
FCchFetchLpszError: TCchFetchLpszError;
{ Indicates whether the thread is done }
FThreadDone: Boolean;
{ Indicates whether the conversion process has been cancelled by the
main thread }
FCancel: Boolean;
FBytesAvailable: Integer;
{ Buffer accessable by the converter dll }
FBuffer: HGLOBAL;
FBufferPtr: PChar;
FTempProgress: Integer;
{ Thread synchronization based on the source of Wordpad, see
http://cvs.wndtabs.com/cgi-bin/viewcvs/viewcvs.cgi/BCG/WordPad/
Import works as follows
Thread RichEdit
------ --------
loop: loop:
@@ Converter converts buffer1 @@ Copy buffer1 to buffer2
richedit processes buffer2
The @@ parts may not happen simultaneously, thus this is converted to:
Thread RichEdit
------ --------
loop: loop:
@@ Converter converts buffer1 [wait until thread ready]
[thread ready] @@ Copy buffer1 to buffer2
[wait until richedit ready] [richedit ready]
richedit retrieves data from buffer2
Export works as follows:
Thread RichEdit
------ --------
loop: loop:
@@ Converter converts buffer1 richedit puts data in buffer2
@@ Copy buffer2 to buffer1
The @@ parts may not happen simultaneously, thus this is converted to:
Thread RichEdit
------ --------
loop: loop:
[thread ready] richedit puts data in buffer2
[wait until richedit ready] [wait until thread ready]
@@ Converter converts buffer1 @@ Copy buffer2 to buffer1
[richedit ready]
- buffer1 is FBuffer
- buffer2 is the Buffer param from ConvertRead or ConvertWrite
}
FRichEditReady: TEvent;
FThreadReady: TEvent;
FConversionError: FCE;
FFileName: HMODULE;
FInitDone: Boolean;
protected
procedure LoadConverter;
procedure FreeConverter;
procedure Check(Result: FCE);
procedure DoError(ErrorCode: FCE);
{ Handled in the context of the thread: }
procedure DoConversion;
function HandleExportCallback(cchBuff, nPercent: Longint): Longint;
function HandleImportCallback(cchBuff, nPercent: Longint): Longint;
procedure WaitUntilThreadReady;
procedure WaitUntilRichEditReady;
procedure Lock;
procedure Unlock;
procedure InitConverter;
public
constructor Create(const AConverterFileName, AExtensions, ADescription: string;
const AKind: TJvConversionKind); virtual;
destructor Destroy; override;
function CanHandle(const AExtension: string; const AKind: TJvConversionKind): Boolean; override;
function CanHandle(const AKind: TJvConversionKind): Boolean; override;
function Open(const AFileName: string; const AKind: TJvConversionKind): Boolean; override;
procedure Done; override;
function TextKind: TJvConversionTextKind; override;
function Filter: string; override;
function IsFormatCorrect(const AFileName: string): Boolean; override;
function TranslateError(ErrorCode: FCE): string;
function ConvertRead(Buffer: PChar; BufSize: Integer): Integer; override;
function ConvertWrite(Buffer: PChar; BufSize: Integer): Integer; override;
function UserCancel: Boolean; override;
function Error: Boolean; override;
function ErrorStr: string; override;
end;
TUndoName = (unUnknown, unTyping, unDelete, unDragDrop, unCut, unPaste);
TRichSearchType = (stWholeWord, stMatchCase, stBackward, stSetSelection);
TRichSearchTypes = set of TRichSearchType;
TRichSelection = (stText, stObject, stMultiChar, stMultiObject);
TRichSelectionType = set of TRichSelection;
TRichLangOption = (rlAutoKeyboard, rlAutoFont, rlImeCancelComplete,
rlImeAlwaysSendNotify);
TRichLangOptions = set of TRichLangOption;
TRichStreamFormat = (sfDefault, sfRichText, sfPlainText);
TRichStreamMode = (smSelection, smPlainRtf, smNoObjects, smUnicode);
TRichStreamModes = set of TRichStreamMode;
TRichEditURLClickEvent = procedure(Sender: TObject; const URLText: string;
Button: TMouseButton) of object;
TRichEditProtectChangeEx = procedure(Sender: TObject; const Msg: TMessage;
StartPos, EndPos: Integer; var AllowChange: Boolean) of object;
TRichEditFindErrorEvent = procedure(Sender: TObject; const FindText: string) of object;
TRichEditFindCloseEvent = procedure(Sender: TObject; Dialog: TFindDialog) of object;
TRichEditProgressEvent = procedure(Sender: TObject; PercentDone: Integer) of object;
TJvCustomRichEdit = class(TJvExCustomMemo)
private
FHideScrollBars: Boolean;
FSelectionBar: Boolean;
FAutoURLDetect: Boolean;
FWordSelection: Boolean;
FPlainText: Boolean;
FSelAttributes: TJvTextAttributes;
FDefAttributes: TJvTextAttributes;
FWordAttributes: TJvTextAttributes;
FParagraph: TJvParaAttributes;
FOldParaAlignment: TParaAlignment;
FScreenLogPixels: Integer;
FUndoLimit: Integer;
FLines: TStrings;
FMemStream: TMemoryStream;
FHideSelection: Boolean;
FLangOptions: TRichLangOptions;
FModified: Boolean;
FLinesUpdating: Boolean;
FPageRect: TRect;
FClickRange: TCharRange;
FClickBtn: TMouseButton;
FFindDialog: TFindDialog;
FReplaceDialog: TReplaceDialog;
FLastFind: TFindDialog;
FAllowObjects: Boolean;
FCallback: TObject;
FRichEditOle: IUnknown;
FPopupVerbMenu: TPopupMenu;
FTitle: string;
FAutoVerbMenu: Boolean;
FAllowInPlace: Boolean;
FDefaultConverter: TJvConversion;
FImageRect: TRect;
FAutoAdvancedTypography: Boolean;
FAdvancedTypography: Boolean;
FOLEDragDrop: Boolean;
FOnSelChange: TNotifyEvent;
FOnResizeRequest: TRichEditResizeEvent;
FOnProtectChange: TRichEditProtectChange;
FOnProtectChangeEx: TRichEditProtectChangeEx;
FOnSaveClipboard: TRichEditSaveClipboard;
FOnURLClick: TRichEditURLClickEvent;
FOnTextNotFound: TRichEditFindErrorEvent;
FOnCloseFindDialog: TRichEditFindCloseEvent;
// From JvRichEdit.pas by S閎astien Buysse
FOnHorizontalScroll: TNotifyEvent;
FOnVerticalScroll: TNotifyEvent;
FOnConversionProgress: TRichEditProgressEvent;
FForceUndo: Boolean;
FUseFixedPopup: Boolean;
// From CCR
FOnInPlaceActivate: TNotifyEvent;
FOnInPlaceDeactivate: TNotifyEvent;
function GetAdvancedTypography: Boolean;
function GetAutoURLDetect: Boolean;
function GetWordSelection: Boolean;
function GetLangOptions: TRichLangOptions;
function GetCanRedo: Boolean;
function GetCanPaste: Boolean;
function GetRedoName: TUndoName;
function GetUndoName: TUndoName;
function GetStreamFormat: TRichStreamFormat;
function GetStreamMode: TRichStreamModes;
function GetSelectionType: TRichSelectionType;
function GetZoom: Integer; // Added by J.G. Boerema
function IsAdvancedTypographyStored: Boolean;
procedure PopupVerbClick(Sender: TObject);
procedure ObjectPropsClick(Sender: TObject);
procedure CloseObjects;
procedure UpdateHostNames;
procedure SetAdvancedTypography(const Value: Boolean);
procedure SetAllowObjects(Value: Boolean);
procedure SetStreamFormat(Value: TRichStreamFormat);
procedure SetStreamMode(Value: TRichStreamModes);
procedure SetAutoURLDetect(Value: Boolean);
procedure SetWordSelection(Value: Boolean);
procedure SetHideScrollBars(Value: Boolean);
procedure SetHideSelection(Value: Boolean);
procedure SetTitle(const Value: string);
procedure SetLangOptions(Value: TRichLangOptions);
procedure SetRichEditStrings(Value: TStrings);
procedure SetDefAttributes(Value: TJvTextAttributes);
procedure SetSelAttributes(Value: TJvTextAttributes);
procedure SetWordAttributes(Value: TJvTextAttributes);
procedure SetSelectionBar(Value: Boolean);
procedure SetOLEDragDrop(const Value: Boolean);
procedure SetUndoLimit(Value: Integer);
procedure SetZoom(Value: Integer); // Added by J.G. Boerema
procedure UpdateTextModes(Plain: Boolean);
procedure AdjustFindDialogPosition(Dialog: TFindDialog);
procedure SetupFindDialog(Dialog: TFindDialog; const SearchStr,
ReplaceStr: string);
function FindEditText(Dialog: TFindDialog; AdjustPos, Events: Boolean): Boolean;
function GetCanFindNext: Boolean;
procedure FindDialogFind(Sender: TObject);
procedure NeedAdvancedTypography;
procedure ReplaceDialogReplace(Sender: TObject);
procedure SetSelText(const Value: string);
procedure FindDialogClose(Sender: TObject);
procedure SetUIActive(Active: Boolean);
procedure CMBiDiModeChanged(var Msg: TMessage); message CM_BIDIMODECHANGED;
procedure CMDocWindowActivate(var Msg: TMessage); message CM_DOCWINDOWACTIVATE;
procedure CMUIDeactivate(var Msg: TMessage); message CM_UIDEACTIVATE;
procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
procedure EMReplaceSel(var Msg: TMessage); message EM_REPLACESEL;
procedure WMDestroy(var Msg: TWMDestroy); message WM_DESTROY;
procedure WMMouseMove(var Msg: TMessage); message WM_MOUSEMOVE;
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
procedure WMRButtonUp(var Msg: TMessage); message WM_RBUTTONUP;
procedure WMSetCursor(var Msg: TWMSetCursor); message WM_SETCURSOR;
procedure WMSetFont(var Msg: TWMSetFont); message WM_SETFONT;
// From JvRichEdit.pas by S閎astien Buysse
procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL;
protected
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -