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

📄 jvunicodeeditor.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 3 页
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html

Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.

The Original Code is: JvUnicodeEditor.PAS, released on 2004-01-25.

The Initial Developers of the Original Code are: Andrei Prygounkov <a dott prygounkov att gmx dott de>
Copyright (c) 1999, 2002 Andrei Prygounkov
All Rights Reserved.

Contributor(s):
Burov Dmitry, translation of russian text.
Andreas Hausladen
Peter Th鰎nqvist
Remko Bonte

You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net

component   : TJvEditor
description : 'Delphi IDE'-like Editor (unicode)

Known Issues:
  Some russian comments were translated to english; these comments are marked
  with [translated]
-----------------------------------------------------------------------------}
// $Id: JvUnicodeEditor.pas,v 1.45 2005/02/24 12:26:10 ahuser Exp $

unit JvUnicodeEditor;

{$I jvcl.inc}

interface

uses
  {$IFDEF UNITVERSIONING}
  JclUnitVersioning,
  {$ENDIF UNITVERSIONING}
  Windows, Messages, Classes, Controls,
  JclWideStrings,
  JvEditorCommon;

type
  TJvCustomWideEditor = class;

  TJvEditorWideStrings = class(TWStringList)
  private
    FJvEditor: TJvCustomWideEditor;
    procedure StringsChanged(Sender: TObject);
    procedure SetInternal(Index: Integer; const Value: WideString);
    procedure ReLine;
    procedure SetLockText(const Text: WideString);
  protected
    procedure Put(Index: Integer; const S: WideString); override;
    procedure InternalPut(Index: Integer; const Value: WideString);

    property Internal[Index: Integer]: WideString write SetInternal;
    property JvEditor: TJvCustomWideEditor read FJvEditor;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
    procedure AddStrings(Strings: TWStrings); override;
    procedure SetTextStr(const Value: WideString); override;
    function Add(const S: WideString): Integer; override;
    procedure Insert(Index: Integer; const S: WideString); override;
    procedure DeleteText(BegX, BegY, EndX, EndY: Integer);
    procedure InsertText(X, Y: Integer; const Text: WideString);
    procedure DeleteColumnText(BegX, BegY, EndX, EndY: Integer);
    procedure InsertColumnText(X, Y: Integer; const Text: WideString);
  end;

  TJvWideCompletion = class;
  TOnCompletionApplyW = procedure(Sender: TObject; const OldString: WideString;
    var NewString: WideString) of object;
  TJvGetLineAttrEventW = procedure(Sender: TObject; var Line: WideString; Index: Integer;
    var Attrs: TLineAttrs) of object;

  TJvCustomWideEditor = class(TJvCustomEditorBase)
  private
    { internal objects }
    FLines: TJvEditorWideStrings;

    { events }
    FOnGetLineAttr: TJvGetLineAttrEventW;
    FOnCompletionApply: TOnCompletionApplyW;

    {$IFDEF VCL}
    procedure WMGetText(var Msg: TWMGetText); message WM_GETTEXT;
    {$ENDIF VCL}

    { get/set for properties }
    function GetLines: TWStrings;
    procedure SetLines(ALines: TWStrings);
    function GetCompletion: TJvWideCompletion;
    procedure SetCompletion(const Value: TJvWideCompletion);
  protected
    function GetLineCount: Integer; override;
    function GetLineLength(Index: Integer): Integer; override;
    function FindNotBlankCharPosInLine(Line: Integer): Integer; override;

    function GetAnsiTextLine(Y: Integer; out Text: AnsiString): Boolean; override;
    function GetAnsiWordOnCaret: AnsiString; override;

    procedure ReLine; override;
    function GetTabStop(X, Y: Integer; Next: Boolean): Integer; override;
    function GetBackStop(X, Y: Integer): Integer; override;
    procedure TextAllChangedInternal(Unselect: Boolean); override;
  protected
    procedure PaintLineText(Line: Integer; ColBeg, ColEnd: Integer;
      var ColPainted: Integer); override;
    procedure InsertChar(const Value: Word); override;
  protected
    procedure SetLockText(const Text: WideString);
    function ExpandTabs(const S: WideString): WideString;
    function GetAutoIndentStop(Y: Integer): Integer; override;

    { triggers for descendants }
    procedure GetLineAttr(var Str: WideString; Line, ColBeg, ColEnd: Integer); virtual;
    function DoCommand(ACommand: TEditCommand; var X, Y: Integer;
      var CaretUndo: Boolean): Boolean; override;
    { TextModified is called when the editor content has changed. }
    procedure TextModified(ACaretX, ACaretY: Integer; Action: TModifiedAction;
      const Text: WideString); dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure ClipboardCopy; override;
    procedure ClipboardPaste; override;
    procedure DeleteSelected; override;

    function GetSelText: WideString;
    procedure SetSelText(const AValue: WideString);
    function GetWordOnCaret: WideString;
    procedure SelectWordOnCaret; override;

    procedure InsertText(const Text: WideString);
    procedure InsertColumnText(X, Y: Integer; const Text: WideString);
    procedure ReplaceWord(const NewString: WideString);
    procedure ReplaceWord2(const NewString: WideString);
    procedure IndentColumns(X: Integer; BegY, EndY: Integer); override;
    procedure UnIndentColumns(X: Integer; BegY, EndY: Integer); override;

    property SelText: WideString read GetSelText write SetSelText;
  public
    { published in descendants }
    property Lines: TWStrings read GetLines write SetLines;
    property Completion: TJvWideCompletion read GetCompletion write SetCompletion;
    property OnGetLineAttr: TJvGetLineAttrEventW read FOnGetLineAttr write FOnGetLineAttr;
    property OnCompletionApply: TOnCompletionApplyW read FOnCompletionApply write FOnCompletionApply;
  end;

  TJvWideEditor = class(TJvCustomWideEditor)
  published
    property BeepOnError;
    property BorderStyle;
    property Lines;
    property ScrollBars;
    property GutterWidth;
    property GutterColor;
    property RightMarginVisible;
    property RightMargin;
    property RightMarginColor;
    property InsertMode;
    property ReadOnly;
    property DoubleClickLine;
    property HideCaret;
    property Completion;
    property TabStops;
    property SmartTab;
    property BackSpaceUnindents;
    property AutoIndent;
    property KeepTrailingBlanks;
    property CursorBeyondEOF;
    property BracketHighlighting;
    property SelForeColor;
    property SelBackColor;
    property SelBlockFormat;

    property OnGetLineAttr;
    property OnChangeStatus;
    property OnScroll;
    property OnResize;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnChange;
    property OnSelectionChange;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnDblClick;
    property OnPaintGutter;
    property OnCompletionIdentifier;
    property OnCompletionTemplate;
    property OnCompletionDrawItem;
    property OnCompletionMeasureItem;
    property OnCompletionApply;

    { TCustomControl }
    property Align;
    property Enabled;
    property Color;
    property Font;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property TabStop;
    property Visible;
    property Anchors;
    property AutoSize;
    property BiDiMode;
    property Constraints;
    property UseDockManager default True;
    property DockSite;
    property DragKind;
    property ParentBiDiMode;
    property OnCanResize;
    property OnConstrainedResize;
    property OnDockDrop;
    property OnDockOver;
    property OnEndDock;
    property OnGetSiteInfo;
    property OnStartDock;
    property OnUnDock;
    property OnEnter;
    property OnExit;
  end;

  TJvWideCompletion = class(TJvCompletionBase)
  private
    FIdentifiers: TWStrings;
    FTemplates: TWStrings;
    FCaretChar: WideChar;
    FCRLF: WideString;
    FSeparator: WideString;
    function GetStrings(Index: Integer): TWStrings;
    procedure SetStrings(Index: Integer; AValue: TWStrings);
    procedure ReplaceWord(const NewString: WideString);
  protected
    procedure FindSelItem(var Eq: Boolean); override;
    procedure MakeItems; override;
    procedure ReplaceWordItemIndex(SubStrStart: Integer); override;
    function GetTemplateCount: Integer; override;
    function GetIdentifierCount: Integer; override;
    function GetAnsiSeparator: AnsiString; override;
  public
    constructor Create(AJvEditor: TJvCustomWideEditor);
    destructor Destroy; override;
  published
    property Identifiers: TWStrings index 0 read GetStrings write SetStrings;
    property Templates: TWStrings index 1 read GetStrings write SetStrings;
    property CaretChar: WideChar read FCaretChar write FCaretChar;
    property CRLF: WideString read FCRLF write FCRLF;
    property Separator: WideString read FSeparator write FSeparator;
  end;

{$IFDEF UNITVERSIONING}
const
  UnitVersioning: TUnitVersionInfo = (
    RCSfile: '$RCSfile: JvUnicodeEditor.pas,v $';
    Revision: '$Revision: 1.45 $';
    Date: '$Date: 2005/02/24 12:26:10 $';
    LogPath: 'JVCL\run'
  );
{$ENDIF UNITVERSIONING}

implementation

uses
  Consts,
  {$IFDEF HAS_UNIT_RTLCONSTS}
  RTLConsts,
  {$ENDIF HAS_UNIT_RTLCONSTS}
  SysUtils, Math, Graphics, Clipbrd,
  JvUnicodeCanvas, JvJCLUtils, JvThemes, JvConsts, JvResources;

type
  TJvInsertUndo = class(TJvCaretUndo)
  private
    FText: WideString;
    function GetEditor: TJvCustomWideEditor;
  public
    constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
      const AText: WideString);
    procedure Undo; override;
  end;

  TJvOverwriteUndo = class(TJvCaretUndo)
  private
    FOldText: WideString;
    FNewText: WideString;
    function GetEditor: TJvCustomWideEditor;
  public
    constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
      const AOldText, ANewText: WideString);
    procedure Undo; override;
  end;

  TJvReLineUndo = class(TJvInsertUndo, IJvUndoCompound);

  TJvInsertTabUndo = class(TJvInsertUndo);

  TJvInsertColumnUndo = class(TJvInsertUndo)
  public
    procedure Undo; override;
  end;

  TJvDeleteUndo = class(TJvInsertUndo)
  public
    procedure Undo; override;
  end;

  TJvDeleteLineUndo = class(TJvInsertUndo)
  public
    procedure Undo; override;
    //procedure Redo; override;
  end;

  TJvDeleteTrailUndo = class(TJvDeleteUndo, IJvUndoCompound);

  TJvBackspaceUndo = class(TJvDeleteUndo, IJvBackspaceUndo)
  public
    procedure Undo; override;
  end;

  TJvBackspaceUnindentUndo = class(TJvDeleteUndo, IJvBackspaceUnindentUndo)
  public
    procedure Undo; override;
  end;

  TJvReplaceUndo = class(TJvCaretUndo)
  private
    FBegX: Integer;
    FBegY: Integer;
    FText: WideString;
    FNewText: WideString;
    function GetEditor: TJvCustomWideEditor;
  public
    constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
      ABegX, ABegY: Integer; const AText, ANewText: WideString);
    procedure Undo; override;
  end;

  TJvDeleteSelectedUndo = class(TJvDeleteUndo)
  public
    constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
      const AText: WideString);
    procedure Undo; override;
  end;

(* // (ahuser) make Delphi 5 compiler happy
  TJvIndentColumnUndo = class(TJvInsertColumnUndo)
  private
    FNewCaretX: Integer;
    FNewCaretY: Integer;
  public
    constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
      ABegX, ABegY: Integer; const AText: WideString);
    procedure Undo; override;
  end;
*)

  TJvUnindentColumnUndo = class(TJvInsertUndo)
  private
    FBegX: Integer;
    FBegY: Integer;
  public
    constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY,
      ABegX, ABegY: Integer; const AText: WideString);
    procedure Undo; override;
  end;

  TJvUndoBufferAccessProtected = class(TJvUndoBuffer);

//=== { TJvEditorWideStrings } ===============================================

constructor TJvEditorWideStrings.Create;
begin
  inherited Create;
  OnChange := StringsChanged;
end;

destructor TJvEditorWideStrings.Destroy;
begin
  OnChange := nil;
  OnChanging := nil;
  inherited Destroy;
end;

procedure TJvEditorWideStrings.Assign(Source: TPersistent);
begin
  JvEditor.BeginUpdate;

⌨️ 快捷键说明

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