📄 rvedit.pas
字号:
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 + -