📄 rvtinplace.pas
字号:
unit RVTInplace;
interface
{$I RV_Defs.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms,
RVStyle, RVFuncs, RVItem,
CRVData, CRVFData, RVRVData, RVERVData,
RVScroll, RichView, RVEdit,
RVRTFProps, RichEdit,
RVTable;
const WM_RVMOVEEDITOR = WM_USER+10;
WM_RVINPLACEUNDO = WM_USER+11;
WM_RVINPLACEREDO = WM_USER+12;
type
TRVTableInplaceRVData = class (TRVEditRVData)
private
resized: Boolean;
protected
procedure Formatted(FirstItemNo, LastItemNo: Integer;Partial: Boolean); override;
public
procedure GetParentInfo(var ParentItemNo: Integer;
var Location: TRVStoreSubRVData); override;
function CanLoadLayout: Boolean; override;
function GetSourceRVData: TCustomRVData; override;
procedure ShowRectangle(Left, Top, Width, Height: Integer); override;
procedure SetDocumentAreaSize(Width,Height: Integer; UpdateH: Boolean); override;
function BuildJumpsCoords(IgnoreReadOnly: Boolean): Integer; override;
function ReallyBuildJumpsCoords: Integer;
procedure ClearJumpsCoords; override;
procedure GetOriginEx(var ALeft, ATop: Integer); override;
function GetAbsoluteParentData: TCustomRVData; override;
function GetAbsoluteRootData: TCustomRVData; override;
procedure DoRVDblClick(const ClickedWord: String; StyleNo: Integer); override;
procedure DoJump(id: Integer); override;
end;
TRVTableInplaceChangeEvent = procedure (Sender: TCustomRichViewEdit; ClearRedo: Boolean) of object;
TRVTableInplaceEdit = class (TRichViewEdit)
private
FRVData: TCustomRVFormattedData;
FTable: TRVTableItemInfo;
FClearing: Boolean;
FOnFormat: TNotifyEvent;
FColor: TColor;
FBusy: Boolean;
FOnChangeEx: TRVTableInplaceChangeEvent;
procedure CMRelease(var Message: TMessage); message CM_RELEASE;
procedure WMMoveEditor(var Message: TMessage); message WM_RVMOVEEDITOR;
procedure WMInplaceUndo(var Message: TMessage); message WM_RVINPLACEUNDO;
procedure WMInplaceRedo(var Message: TMessage); message WM_RVINPLACEREDO;
procedure WMUndo(var Message: TMessage); message WM_UNDO;
procedure EMUndo(var Message: TMessage); message EM_UNDO;
procedure EMRedo(var Message: TMessage); message EM_REDO;
procedure EMCanUndo(var Message: TMessage); message EM_CANUNDO;
procedure EMCanRedo(var Message: TMessage); message EM_CANREDO;
protected
function GetDataClass: TRichViewRVDataClass; override;
procedure KeyPress(var Key: Char); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
function GetRTFReadProperties: TRVRTFReaderProperties; override;
procedure WndProc(var Message: TMessage); override;
procedure SetReadOnly(const Value: Boolean); override;
function GetReadOnly: Boolean; override;
public
FClickTime: Longint;
FTableItemNo: Integer;
FCell: TRVTableCellData;
FRow, FCol: Integer;
NormalScrolling: Boolean;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function RTFReaderAssigned: Boolean; override;
procedure DoChange(ClearRedo: Boolean); override;
procedure SetParentRVData(RVData: TCustomRVFormattedData);
procedure SetCell(Row, Col: Integer; Table: TRVTableItemInfo; CellPadding: Integer);
procedure SetVPos(p: Integer; Redraw: Boolean);override;
procedure SetHPos(p: Integer);override;
procedure SetClearingState;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);override;
procedure SelectCompletely(Select: Boolean);
function BeforeChange(FromOutside: Boolean): Boolean; override;
function Resized: Boolean;
procedure Undo; override;
procedure Redo; override;
procedure Click; override;
procedure DragDrop(Source: TObject; X, Y: Integer); override;
procedure DoEndDrag(Target: TObject; X, Y: Integer); override;
//procedure DblClick; override;
property OnFormat: TNotifyEvent read FOnFormat write FOnFormat;
property Busy: Boolean read FBusy;
property OnChangeEx: TRVTableInplaceChangeEvent read FOnChangeEx write FOnChangeEx;
property ReadOnly: Boolean read GetReadOnly write SetReadOnly;
end;
implementation
uses RVUndo;
{=============================== TRVTableInplaceEdit ==========================}
constructor TRVTableInplaceEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
BorderStyle := bsNone;
Visible := False;
Flags := Flags - [rvflRootEditor,rvflRoot];
{$IFDEF RICHVIEWDEF4}
WheelStep := 0;
{$ENDIF}
end;
{------------------------------------------------------------------------------}
function TRVTableInplaceEdit.GetDataClass: TRichViewRVDataClass;
begin
Result := TRVTableInplaceRVData;
end;
{------------------------------------------------------------------------------}
destructor TRVTableInplaceEdit.Destroy;
begin
Destroying;
if FClearing and (InplaceEditor<>nil) and (InplaceEditor is TRVTableInplaceEdit) then
TRVTableInplaceEdit(InplaceEditor).SetClearingState;
DestroyInplace;
FRVData.UnAssignChosenRVData(FCell);
FTable.InplaceDeleted(FClearing);
if not FClearing and (Parent<>nil) and (Parent is TCustomRichView) then
TCustomRichView(Parent).SetFocusSilent;
inherited Destroy;
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.SetCell(Row, Col: Integer;
Table: TRVTableItemInfo;
CellPadding: Integer);
begin
FRow := Row;
FCol := Col;
FCell := Table.Cells[Row,Col];
FTable := Table;
FTableItemNo := FRVData.GetItemNo(FTable);
LeftMargin := CellPadding;
TopMargin := CellPadding;
RightMargin := CellPadding;
BottomMargin := CellPadding;
TRVEditRVData(RVData).UndoList.FRVData := TCustomRVFormattedData(RVData.GetAbsoluteRootData);
TRVEditRVData(RVData).RedoList.FRVData := TCustomRVFormattedData(RVData.GetAbsoluteRootData);
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.SetParentRVData(RVData: TCustomRVFormattedData);
begin
FRVData := RVData;
Options := RVData.Options;
RVFOptions := RVData.RVFOptions;
RTFOptions := RVData.RTFOptions;
Style := RVData.GetRVStyle;
VSmallStep := 1;
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.SetVPos(p: Integer; Redraw: Boolean);
begin
if NormalScrolling then
inherited;
// else no scroll
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.SetHPos(p: Integer);
begin
// no scroll
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.SetClearingState;
begin
FClearing := True;
end;
{------------------------------------------------------------------------------}
function TRVTableInplaceEdit.Resized: Boolean;
begin
Result := TRVTableInplaceRVData(RVData).Resized;
TRVTableInplaceRVData(RVData).Resized := False;
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
if (Button=mbLeft) and FTable.StartSelecting(FRow,FCol) then begin
if (FRVData is TRichViewRVData) then
TCustomRichView(TRichViewRVData(FRVData).RichView).ActivateScrollTimer;
FBusy := True;
end;
end;
{------------------------------------------------------------------------------}
function TRVTableInplaceEdit.BeforeChange(FromOutside: Boolean): Boolean;
begin
if (FRVData is TRVEditRVData) then
Result := TCustomRichViewEdit(TRichViewRVData(FRVData).RichView).BeforeChange(True)
else
Result := False;
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.MouseMove(Shift: TShiftState; X, Y: Integer);
// var data: TRVMouseMoveMessageData;
// p: TPoint;
begin
if (ssLeft in Shift) and
(rvstMakingSelection in RVData.State) and
(FRVData is TRichViewRVData) then
TCustomRichView(TRichViewRVData(FRVData).RichView).MouseMove(Shift, X+Left, Y+Top);
inherited;
{
data := TRVMouseMoveMessageData.Create;
data.Event := rvetMouseMove;
p := ClientToScreen(Point(X,Y));
p := RVData.GetAbsoluteRootData.GetParentControl.ScreenToClient(p);
data.X := p.X;
data.Y := p.Y;
data.Shift := Shift;
PostMessage(RVData.GetAbsoluteRootData.GetParentControl.Handle, WM_RVEVENT, Integer(Data), 0);
}
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var OnMUp: TRVMouseEvent;
ParentRichView: TCustomRichView;
begin
if (Button in [mbLeft,mbRight]) and (GetCaptureControl=Self) then
ReleaseCapture;
inherited;
if (Button=mbLeft) then begin
FBusy := False;
if FTable.FMakingSelection and
(FRVData is TRichViewRVData) then begin
ParentRichView := TCustomRichView(TRichViewRVData(FRVData).RichView);
OnMUp := ParentRichView.OnRVMouseUp;
ParentRichView.OnRVMouseUp := nil;
try
ParentRichView.MouseUp(Button, Shift, X+Left, Y+Top);
finally
ParentRichView.OnRVMouseUp := OnMUp;
end;
if (rvstCompletelySelected in RVData.State) then
PostMessage(Handle, CM_RELEASE, 0, 0)
else
SelectCompletely(False);
end;
end;
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.SelectCompletely(Select: Boolean);
begin
if Select = (rvstCompletelySelected in RVData.State) then
exit;
if Select then begin
RVData.State := RVData.State + [rvstCompletelySelected];
FColor := Color;
Color := Style.SelColor;
end
else begin
RVData.State := RVData.State - [rvstCompletelySelected];
Color := FColor;
end;
TRVEditRVData(RVData).ChangeCaret(True, False, True, True);
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.CMRelease(var Message: TMessage);
var AParent: TWinControl;
begin
AParent := Parent;
Free;
if (AParent<>nil) and (AParent.Visible) then
AParent.SetFocus;
end;
{------------------------------------------------------------------------------}
procedure TRVTableInplaceEdit.WMMoveEditor(var Message: TMessage);
var NewRow, NewCol: Integer;
dir: TRVCellDirection;
AParent: TWinControl;
idx, offs: Integer;
begin
AParent := Parent;
dir := TRVCellDirection(Message.WParam);
case dir of
rvcdDocTop:
begin
idx := 0;
offs := FRVData.GetRootData.GetOffsBeforeItem(idx);
TCustomRVFormattedData(FRVData.GetRootData).SetSelectionBounds(idx,offs,idx,offs);
AParent.SetFocus;
exit;
end;
rvcdDocBottom:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -