⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rvtinplace.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -