# dlangui.widgets.editors

DLANGUI library.
This module contains implementation of editors.
EditLine - single line editor.
EditBox - multiline editor
Synopsis:

    import dlangui.widgets.editors;

License:
Boost License 1.0
Authors:
Vadim Lopatin, coolreader.org@gmail.com

enum EditorActions: int;
  Editor action codes
  Left
    move cursor one char left
  SelectLeft
    move cursor one char left with selection
  Right
    move cursor one char right
  SelectRight
    move cursor one char right with selection
  Up
    move cursor one line up
  SelectUp
    move cursor one line up with selection
  Down
    move cursor one line down
  SelectDown
    move cursor one line down with selection
  WordLeft
    move cursor one word left
  SelectWordLeft
    move cursor one word left with selection
  WordRight
    move cursor one word right
  SelectWordRight
    move cursor one word right with selection
  PageUp
    move cursor one page up
  SelectPageUp
    move cursor one page up with selection
  PageDown
    move cursor one page down
  SelectPageDown
    move cursor one page down with selection
  PageBegin
    move cursor to the beginning of page
  SelectPageBegin
    move cursor to the beginning of page with selection
  PageEnd
    move cursor to the end of page
  SelectPageEnd
    move cursor to the end of page with selection
  LineBegin
    move cursor to the beginning of line
  SelectLineBegin
    move cursor to the beginning of line with selection
  LineEnd
    move cursor to the end of line
  SelectLineEnd
    move cursor to the end of line with selection
  DocumentBegin
    move cursor to the beginning of document
  SelectDocumentBegin
    move cursor to the beginning of document with selection
  DocumentEnd
    move cursor to the end of document
  SelectDocumentEnd
    move cursor to the end of document with selection
  DelPrevChar
    delete char before cursor (backspace)
  DelNextChar
    delete char after cursor (del key)
  DelPrevWord
    delete word before cursor (ctrl + backspace)
  DelNextWord
    delete char after cursor (ctrl + del key)
  InsertNewLine
    insert new line (Enter)
  PrependNewLine
    insert new line after current position (Ctrl+Enter)
  ToggleReplaceMode
    Turn On/Off replace mode
  Copy
    Copy selection to clipboard
  Cut
    Cut selection to clipboard
  Paste
    Paste selection from clipboard
  Undo
    Undo last change
  Redo
    Redo last undoed change
  Tab
    Tab (e.g., Tab key to insert tab character or indent text)
  BackTab
    Tab (unindent text, or remove whitespace before cursor, usually Shift+Tab)
  SelectAll
    Select whole content (usually, Ctrl+A)
  ScrollLineUp
    Scroll one line up (not changing cursor)
  ScrollLineDown
    Scroll one line down (not changing cursor)
  ScrollPageUp
    Scroll one page up (not changing cursor)
  ScrollPageDown
    Scroll one page down (not changing cursor)
  ScrollLeft
    Scroll window left
  ScrollRight
    Scroll window right
  ZoomIn
    Zoom in editor font
  ZoomOut
    Zoom out editor font
dstring[] splitDString(dstring source, dchar delimiter = EOL);
  split dstring by delimiters
dstring concatDStrings(dstring[] lines, dstring delimiter = SYSTEM_DEFAULT_EOL);
  concat strings from array using delimiter
dstring replaceEolsWithSpaces(dstring source);
  replace end of lines with spaces
struct TextPosition;
  text content position
  int line;
    line number, zero based
  int pos;
    character position in line (0 == before first character)
  const int opCmp(ref const TextPosition v);
    compares two positions
struct TextRange;
  text content range
  const @property bool empty();
    returns true if range is empty
  const @property bool singleLine();
    returns true if start and end located at the same line
  const @property int lines();
    returns count of lines in range
enum EditAction: int;
  action performed with editable contents
  Replace
    insert content into specified position (range.start) delete content in range replace range content with new content
class EditOperation;
  edit operation details for EditableContent
  @property EditAction action();
    action performed
  @property ref TextRange range();
    source range to replace with new content
  @property ref TextRange newRange();
    new range after operation applied
  protected dstring[] _content;
    new content for range (if required for this action)
  protected dstring[] _oldContent;
    old content for range
  bool merge(EditOperation op);
    try to merge two operations (simple entering of characters in the same line), return true if succeded
class UndoBuffer;
  Undo/Redo buffer
  @property bool hasUndo();
    returns true if buffer contains any undo items
  @property bool hasRedo();
    returns true if buffer contains any redo items
  void saveForUndo(EditOperation op);
    adds undo operation
  EditOperation undo();
    returns operation to be undone (put it to redo), null if no undo ops available
  EditOperation redo();
    returns operation to be redone (put it to undo), null if no undo ops available
  void clear();
    clears both undo and redo buffers
interface EditableContentListener;
  Editable Content change listener
class EditableContent;
  editable plain text (singleline/multiline)
  Signal!EditableContentListener contentChangeListeners;
    listeners for edit operations
  @property bool multiline();
    returns true if miltyline content is supported
  @property dstring text();
    returns all lines concatenated delimited by '\n'
  @property EditableContent text(dstring newContent);
    replace whole text with another content
  @property int length();
    returns line text
  dstring line(int index);
    returns line text by index, "" if index is out of bounds
  TextPosition lineEnd(int lineIndex);
    returns text position for end of line lineIndex
  TextPosition firstNonSpace(int lineIndex);
    returns position before first non-space character of line, returns 0 position if no non-space chars
  TextPosition lastNonSpace(int lineIndex);
    returns position after last non-space character of line, returns 0 position if no non-space chars on line
  int lineLength(int lineIndex);
    returns text position for end of line lineIndex
  int maxLineLength();
    returns maximum length of line
  dstring[] rangeText(TextRange range);
    return text for specified range
  void correctPosition(ref TextPosition position);
    when position is out of content bounds, fix it to nearest valid position
  void correctRange(ref TextRange range);
    when range positions is out of content bounds, fix it to nearest valid position
  protected void removeLines(int start, int removedCount);
    removes removedCount lines starting from start
  protected void insertLines(int start, int count);
    inserts count empty lines at specified position
  protected void replaceRange(TextRange before, TextRange after, dstring[] newContent);
    inserts or removes lines, removes text in range
  TextPosition moveByWord(TextPosition p, int direction, bool camelCasePartsAsWords);
    change text position to nearest word bound (direction < 0 - back, > 0 - forward)
  bool performOperation(EditOperation op, Object source);
    edit content
  @property bool hasUndo();
    return true if there is at least one operation in undo buffer
  @property bool hasRedo();
    return true if there is at least one operation in redo buffer
  bool undo();
    undoes last change
  bool redo();
    redoes last undone change
  void clearUndo();
    clear undo/redp history
abstract class EditWidgetBase: dlangui.widgets.widget.WidgetGroup, dlangui.widgets.editors.EditableContentListener, dlangui.widgets.menu.MenuItemActionHandler;
  base for all editor widgets
  bool onMenuItemAction(const Action action);
  bool canShowPopupMenu(int x, int y);
    returns true if widget can show popup (e.g. by mouse right click at point x,y)
  bool isActionEnabled(const Action action);
    override to change popup menu items state
  void showPopupMenu(int x, int y);
    shows popup at (x,y)
  uint getCursorType(int x, int y);
    returns mouse cursor type for widget
  @property bool wantTabs();
    when true, Tab / Shift+Tab presses are processed internally in widget (e.g. insert tab character) instead of focus change navigation.
  @property EditWidgetBase wantTabs(bool wantTabs);
    sets tab size (in number of spaces)
  @property bool readOnly();
    readonly flag (when true, user cannot change content of editor)
  @property EditWidgetBase readOnly(bool readOnly);
    sets readonly flag
  @property bool replaceMode();
    replace mode flag (when true, entered character replaces character under cursor)
  @property EditWidgetBase replaceMode(bool replaceMode);
    sets replace mode flag
  @property bool useSpacesForTabs();
    when true, spaces will be inserted instead of tabs
  @property EditWidgetBase useSpacesForTabs(bool useSpacesForTabs);
    set new Tab key behavior flag: when true, spaces will be inserted instead of tabs
  @property int tabSize();
    returns tab size (in number of spaces)
  @property EditWidgetBase tabSize(int newTabSize);
    sets tab size (in number of spaces)
  @property EditableContent content();
    editor content object
  protected bool _ownContent;
    when ownContent is false, content should not be destroyed in editor destructor
  @property EditWidgetBase content(EditableContent content);
    set content object
  @property dstring text();
    get widget text
  @property Widget text(dstring s);
    set text
  @property Widget text(UIString s);
    set text
  protected Rect caretRect();
    returns cursor rectangle
  protected void drawCaret(DrawBuf buf);
    draws caret
  protected void updateScrollbars();
    override to update scrollbars - if necessary
  protected void correctCaretPos();
    when cursor position or selection is out of content bounds, fix it to nearest valid position
  protected dstring spacesForTab(int currentPos);
    generate string of spaces, to reach next tab position
  protected bool wholeLinesSelected();
    returns true if one or more lines selected fully
  protected dstring indentLine(dstring src, bool back);
    change line indent
  protected void indentRange(bool back);
    indent / unindent range
  protected Action findKeyAction(uint keyCode, uint flags);
    map key to action
  bool onKeyEvent(KeyEvent event);
    handle keys
  bool onMouseEvent(MouseEvent event);
    process mouse event; return true if event is processed by widget.
class EditLine: dlangui.widgets.editors.EditWidgetBase;
  single line editor
  void measure(int parentWidth, int parentHeight);
    measure
  bool onKeyEvent(KeyEvent event);
    handle keys
  bool onMouseEvent(MouseEvent event);
    process mouse event; return true if event is processed by widget.
  void layout(Rect rc);
    Set widget rectangle to specified value and layout widget contents. (Step 2 of two phase layout).
  protected void drawLineBackground(DrawBuf buf, Rect lineRect, Rect visibleRect);
    override to custom highlight of line background
  void onDraw(DrawBuf buf);
    draw content
class EditBox: dlangui.widgets.editors.EditWidgetBase, dlangui.widgets.controls.OnScrollHandler;
  single line editor
  bool onScrollEvent(AbstractSlider source, ScrollEvent event);
    handle scroll event
  void measure(int parentWidth, int parentHeight);
    measure
  void layout(Rect rc);
    Set widget rectangle to specified value and layout widget contents. (Step 2 of two phase layout).
  protected void drawLineBackground(DrawBuf buf, int lineIndex, Rect lineRect, Rect visibleRect);
    override to custom highlight of line background
  void onDraw(DrawBuf buf);
    draw content

Page generated by Ddoc. Vadim Lopatin, 2014