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

📄 rvedit.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 5 页
字号:
procedure TCustomRichViewEdit.EMRedo(var Message: TMessage);
begin
  Message.Result := Integer(RedoAction<>rvutNone);
  if Message.Result<>0 then
    Redo;
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.WMClear(var Message: TMessage);
begin
  DeleteSelection;
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.WMUndo(var Message: TMessage);
begin
  Message.Result := Integer(UndoAction<>rvutNone);
  Undo;
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.EMUndo(var Message: TMessage);
begin
  Message.Result := Integer(UndoAction<>rvutNone);
  Undo;
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.EMCanRedo(var Message: TMessage);
begin
  Message.Result := Integer(RedoAction<>rvutNone);
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.EMCanUndo(var Message: TMessage);
begin
  Message.Result := Integer(UndoAction<>rvutNone);
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.CurParaStyleChange;
begin
  if (Style<>nil) and not (csDestroying in ComponentState) and
     Assigned(FOnCurParaStyleChanged) then
    FOnCurParaStyleChanged(Self);
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.CurTextStyleChange;
begin
  if (Style<>nil) and not (csDestroying in ComponentState) and
     Assigned(FOnCurTextStyleChanged) then
     FOnCurTextStyleChanged(Self);
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.SetCurParaStyleNo(const Value: Integer);
begin
  {$IFNDEF RVDONOTUSEINPLACE}
  if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
    TCustomRichViewEdit(InplaceEditor).SetCurParaStyleNo(Value);
    exit;
  end;
  {$ENDIF}
  if (TRVEditRVData(RVData).FCurParaStyleNo <> Value) or
     (rvstForceStyleChangeEvent in RVData.State) then begin
    TRVEditRVData(RVData).FCurParaStyleNo := Value;
    CurParaStyleChange;
  end;
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.SetCurTextStyleNo(const Value: Integer);
begin
  {$IFNDEF RVDONOTUSEINPLACE}
  if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
    TCustomRichViewEdit(InplaceEditor).SetCurTextStyleNo(Value);
    exit;
  end;
  {$ENDIF}
  if (TRVEditRVData(RVData).FCurTextStyleNo <> Value) or
      (rvstForceStyleChangeEvent in RVData.State)
   then begin
    Exclude(RVData.State, rvstForceStyleChangeEvent);
    TRVEditRVData(RVData).FCurTextStyleNo := Value;
    CurTextStyleChange;
    {$IFDEF RVDEBUG}{$I Debug\k.inc}{$ENDIF}
  end;
end;
{------------------------------------------------------------------------------}
function TCustomRichViewEdit.GetCurParaStyleNo: Integer;
begin
  Result := TRVEditRVData(GetTopLevelEditor.RVData).FCurParaStyleNo;
end;
{------------------------------------------------------------------------------}
function TCustomRichViewEdit.GetCurTextStyleNo: Integer;
begin
  Result := TRVEditRVData(GetTopLevelEditor.RVData).FCurTextStyleNo;
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.KeyUp(var Key: Word; Shift: TShiftState);
begin
  if Key=VK_CONTROL then begin
    TRVEditRVData(RVdata).ClearJumpsCoords;
    GenerateMouseMove;
  end;
  inherited KeyUp(Key, Shift);
end;
{-----------------------------------------------------------------------}
procedure TCustomRichViewEdit.WMSysChar(var Message: TWMSysChar);
begin
  if (Message.CharCode = VK_BACK) and (UndoLimit<>0) then
    Message.Result := 0
  else
    inherited;
end;
{-----------------------------------------------------------------------}
{$IFDEF VER93} // C++Builder 1
function ToUnicode(wVirtKey, wScanCode: UINT; const KeyState: TKeyboardState;
  var pwszBuff; cchBuff: Integer; wFlags: UINT): Integer; stdcall;
  external user32 name 'ToUnicode';
{$ENDIF}
procedure TCustomRichViewEdit.WMKeyDown(var Message: TWMKeyDown);
{$IFNDEF RVDONOTUSEUNICODE}
var KeyState: TKeyboardState;
    s: String;
    Len: Integer;
{$ENDIF}
    function IsSpecialLanguage: Boolean;
    //var Language: Integer;
    begin
      Result := RVU_GetKeyboardCodePage = 0;
     {
      Language := (GetKeyboardLayout(0) and $FFFF);
      Result := (Language = $0439) or // Hindi
                (Language = $0449);   // Tamil
     }
    end;
begin
  {$IFNDEF RVDONOTUSEUNICODE}
  RVData.State := RVData.State-[rvstIgnoreNextChar];
  Len := 0;
  if RVNT and IsSpecialLanguage then
    BeforeUnicode;
  if ((RichViewUnicodeInput=rvuiAlternative) or IsSpecialLanguage) and RVNT and
     Style.TextStyles[CurTextStyleNo].Unicode then begin
    // Manual translation of key codes to Unicode
    if Message.CharCode in [ord('A')..ord('Z'),ord('0')..ord('9'),187..192,220] then begin
      if Style.TextStyles[CurTextStyleNo].Unicode then begin
        SetLength(s,10);
        if GetKeyboardState(KeyState)
          and not (((KeyState[VK_CONTROL] and $80)<>0) and ((KeyState[VK_MENU] and $80)=0)) then begin
          Len := ToUnicode(Message.CharCode, Message.KeyData, KeyState, PChar(s)^, 5, 0);
          if Len>0 then begin
            TRVEditRVData(RVData).DeleteSelection_;
            SetLength(s, Len*2);
            if Len=1 then
              TRVEditRVData(RVData).InsertTextTyping(s)
            else
              InsertTextW_(s);
          end;
        end;
      end;
    end;
  end;
  if Len<=0 then
    inherited
  else begin
    Message.CharCode := 0;
    Message.Result   := 0;
    RVData.State := RVData.State+[rvstIgnoreNextChar];
  end;
  {$ELSE}
  inherited;
  {$ENDIF}
end;
{-----------------------------------------------------------------------}
procedure TCustomRichViewEdit.KeyDown(var Key: Word; Shift: TShiftState);
var selchanged : ByteBool;
  {........................................................}

  procedure GetOut(Direction: TRVGetOutDirection);
  begin
    if Assigned(FOnCaretGetOut) then
      FOnCaretGetOut(Self, Direction);
  end;
begin
  TRVEditRVData(RVData).PrepareForEdit;
  if (Key=VK_RETURN) and (rvoDoNotWantReturns in EditorOptions) then
    Key := 0;
  if IsUndoShortcut(Shift, Key) then begin
    Undo;
    Key := 0;
    end
  else if IsRedoShortcut(Shift, Key) then begin
    Redo;
    Key := 0;
  end;
  if Key = 0 then
    exit;  
  inherited KeyDown(Key, Shift);
  if Key = 0 then
    exit;
  // Step 1 of 3. Working with selection
  selchanged := False;
  case Key of
    VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN,
    VK_HOME, VK_END, VK_PRIOR, VK_NEXT:
    begin
      // if cursor movement key, then handle selection
      if ssShift in Shift then begin
          TRVEditRVData(RVData).StartShiftMoving;
          selchanged := True;
        end
      else begin
        selchanged := SelectionExists;
        if selchanged then Deselect;
      end
    end;
  VK_MENU, VK_SHIFT,
  VK_F1..VK_F24, VK_SCROLL, VK_NUMLOCK, VK_PAUSE, VK_CAPITAL, VK_ESCAPE,
  VK_SNAPSHOT, VK_LWIN, VK_RWIN, VK_APPS:
    begin
      // Do nothing
    end;
  VK_CONTROL:
    begin
      if (rvoCtrlJumps in EditorOptions) and not (rvflUseJumps in Flags) then begin
        TRVEditRVData(RVData).BuildJumpsCoords(False);
        GenerateMouseMove;
      end;
    end;
  VK_BACK, VK_DELETE:
    begin
      if not BeforeChange(False) then exit;
      // if selection exists then delete it and forbid further actions
      selchanged := SelectionExists;
      if selchanged then begin
        if IsCutShortcut(Shift, Key) then
          SendMessage(Handle, WM_CUT, 0, 0)
        else begin
          TRVEditRVData(RVData).DeleteSelection_;
          Key := 0;
          Refresh;
        end;
        Exit;
      end;
    end;
  else
    begin
      if IsCopyShortcut(Shift,Key) then begin
        //SendMessage(Handle, WM_COPY, 0, 0); handled by RichView
        Key := 0;
        exit;
      end;
      if IsCutShortcut(Shift, Key) then begin
        SendMessage(Handle, WM_CUT, 0, 0);
        exit;
      end;
      if IsPasteShortcut(Shift, Key) then begin
        SendMessage(Handle, WM_PASTE, 0, 0);
        exit;
      end;
      if not (ssAlt in Shift) and not (ssCtrl in Shift) and (Key<>VK_INSERT) then begin
        // Just delete selection, if it exists
        selchanged := SelectionExists;
        if selchanged then begin
          if not BeforeChange(False) then exit;
          TRVEditRVData(RVData).DeleteSelection_;
        end;
      end;
    end;
  end;
  // Step 2 of 3. Processing the key
  case Key of
    VK_RETURN:
      begin
        if not ((ssShift in Shift) and (rvoDoNotWantShiftReturns in EditorOptions)) then
          OnEnterPress(ssShift in Shift);
        Key := 0;
        exit;
      end;
    VK_BACK:
      begin
        OnBackSpacePress(ssCtrl in Shift);
        {$IFDEF RVDEBUG}{$I Debug\j.inc}{$ENDIF}
        Key := 0;
        exit;
      end;
    VK_DELETE:
      begin
        OnDeletePress(ssCtrl in Shift);
        Key := 0;
        exit;
      end;
    VK_HOME:
      if TRVEditRVData(RVData).OnHomePress(ssCtrl in Shift) then
        GetOut(rvdTop);
    VK_END:
      if TRVEditRVData(RVData).OnEndPress(ssCtrl in Shift) then
        GetOut(rvdBottom);
    VK_LEFT:
      if BiDiMode=rvbdRightToLeft then begin
        if TRVEditRVData(RVData).OnRightPress(ssShift in Shift, ssCtrl in Shift) then
          GetOut(rvdRight);
        end
      else begin
        if TRVEditRVData(RVData).OnLeftPress(ssShift in Shift, ssCtrl in Shift) then
          GetOut(rvdLeft);
      end;
    VK_RIGHT:
      if BiDiMode=rvbdRightToLeft then begin
        if TRVEditRVData(RVData).OnLeftPress(ssShift in Shift, ssCtrl in Shift) then
          GetOut(rvdLeft);
        end
      else begin
        if TRVEditRVData(RVData).OnRightPress(ssShift in Shift, ssCtrl in Shift) then
          GetOut(rvdRight);
      end;
    VK_UP:
      if TRVEditRVData(RVData).OnUpPress(ssShift in Shift, ssCtrl in Shift) then
        GetOut(rvdUp);
    VK_DOWN:
      if TRVEditRVData(RVData).OnDownPress(ssShift in Shift, ssCtrl in Shift) then
        GetOut(rvdDown);      
    VK_PRIOR:
      TRVEditRVData(RVData).OnPgUpPress;
    VK_NEXT:
      TRVEditRVData(RVData).OnPgDownPress;
    VK_TAB:
      begin
        if ssCtrl in Shift then
          PostMessage(Handle, WM_CHAR, VK_TAB, 0)
      end;
    else
      begin
        if selchanged then
          Invalidate;
        exit;
      end;
  end;
  // Step 3 of 3: Processing selection (if key is arrow-moving key)
  if ssShift in Shift then
    TRVEditRVData(RVData).EndShiftMoving;
  if selchanged then Invalidate;
end;
{------------------------------------------------------------------------------}
procedure TCustomRichViewEdit.ApplyParaStyle(ParaStyleNo: Integer);
begin
  {$IFNDEF RVDONOTUSEINPLACE}
  if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
    TCustomRichViewEdit(InplaceEditor).ApplyParaStyle(ParaStyleNo);
    exit;
  end;
  {$ENDIF}
  if not BeforeChange(False) then exit;
  TRVEditRVData(RVData).BeginUndoSequence(rvutPara, True);
  TRVEditRVData(RVData).ApplyParaStyle(ParaStyleNo,False);
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -