Extends
Constructor
new ve.ce.Surface(model, ui, [config])
#
Hierarchy
ContentEditable surface.
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
model |
ve.dm.Surface | Surface model to observe |
|
ui |
ve.ui.Surface | Surface user interface |
|
config |
Object |
optional |
Configuration options |
- Mixes in:
- Source:
Properties
cursorHolderTemplatestatic
#
inputTypeCommands :Object.<string, (string|null|Object)>static
#
Values of InputEvent.inputType which map to a command
Currently these are triggered when the user selects undo/redo from the context menu in Chrome, or uses the selection formatting tools on iOS.
See https://w3c.github.io/input-events/
commands like { collapsed: 'foo', uncollapsed: 'bar' } act conditionally depending whether the selection is collapsed
A value of null
will perform no action and
preventDefault. A value of undefined
will do nothing
and let the event continue.
Type:
- Source:
Values of InputEvent.inputType which map to a command
Currently these are triggered when the user selects undo/redo from the context menu in Chrome, or uses the selection formatting tools on iOS.
Methods
activate()
#
Reactivate the surface and restore the native selection
- Source:
Fires:
afterDocumentKeyDown(e)
#
Deferred until after document key down event
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | keydown event |
- Source:
afterDocumentMouseDown(e, selectionBefore)
#
Deferred until after document mouse down
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Mouse down event |
selectionBefore |
ve.ce.Selection | Selection before the mouse event |
- Source:
afterDocumentMouseUp(e, selectionBefore)
#
Deferred until after document mouse up
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Mouse up event |
selectionBefore |
ve.ce.Selection | Selection before the mouse event |
- Source:
afterMutations(mutationRecords)
#
Handler for mutation observer
Identifies deleted DOM nodes, and finds and deletes corresponding model structural nodes. Mutation observers run asynchronously (on the microtask queue) so the current document state may differ from when the mutations happened. Therefore this handler rechecks node attachment, document ranges etc.
Parameters:
Name | Type | Description |
---|---|---|
mutationRecords |
Array.<MutationRecord> | Records of the mutations observed |
- Source:
Handler for mutation observer
Identifies deleted DOM nodes, and finds and deletes corresponding model structural nodes.
afterRenderLock(callback)
#
Escape the current render lock
Parameters:
Name | Type | Description |
---|---|---|
callback |
function | Function to run after render lock |
- Source:
annotationsAtFocus([filter]) → {Array.<ve.ce.Annotation>}
#
Get the annotation views containing the cursor focus
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
filter |
function |
optional |
Function to filter view nodes by. |
- Source:
Returns:
Annotation views
- Type
- Array.<ve.ce.Annotation>
annotationsAtModelSelection([filter], [offset]) → {Array.<ve.ce.Annotation>}
#
Get the annotation views at the current model selection
TODO: This doesn't work for annotations that span fewer than one character, as getNodeAndOffset will never return an offset inside that annotation.
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
filter |
function |
optional |
Function to filter view nodes by. |
offset |
number |
optional |
Model offset. Defaults to start of current selection. |
- Source:
Returns:
Annotation views
- Type
- Array.<ve.ce.Annotation>
Get the annotation views at the current model selection
TODO: This doesn't work for annotations that span fewer than one character, as getNodeAndOffset will never return an offset inside that annotation.
annotationsAtNode(node, [filter]) → {Array.<ve.ce.Annotation>}
#
Get the annotation views containing the cursor focus
Only returns annotations which can be active.
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
node |
Node | Node at which to search for annotations |
|
filter |
function |
optional |
Function to filter view nodes by. Takes one argument which is the view node and returns a boolean. |
- Source:
Returns:
Annotation views
- Type
- Array.<ve.ce.Annotation>
Get the annotation views containing the cursor focus
Only returns annotations which can be active.
appendHighlights($highlights, focused)
#
Append passed highlights to highlight container.
Parameters:
Name | Type | Description |
---|---|---|
$highlights |
jQuery | Highlights to append |
focused |
boolean | Highlights are currently focused |
- Source:
blur()
#
Blur the surface
- Source:
changeModel(transactions, selection)
#
Change the model only, not the CE surface
This avoids event storms when the CE surface is already correct
Parameters:
Name | Type | Description |
---|---|---|
transactions |
ve.dm.Transaction
|
Array.<ve.dm.Transaction>
|
null
|
One or more transactions to process, or null to process none |
selection |
ve.dm.Selection | New selection |
- Source:
Throws:
-
If calls to this method are nested
- Type
- Error
Change the model only, not the CE surface
This avoids event storms when the CE surface is already correct
cleanupUnicorns(fixupCursor) → {boolean}
#
Check whether the DOM selection has moved out of the unicorned area (i.e. is not currently between two unicorns) and if so, set the model selection from the DOM selection, destroy the unicorns and return true. If there are no active unicorns, this function does nothing and returns false.
If the unicorns are destroyed as a consequence of the user moving the cursor across a unicorn with the left/rightarrow keys, the cursor will have to be moved again to produce the cursor movement the user expected. Set the fixupCursor parameter to true to enable this behavior.
Parameters:
Name | Type | Description |
---|---|---|
fixupCursor |
boolean | If destroying unicorns, fix up left/rightarrow cursor position |
- Source:
Returns:
Whether unicorns have been destroyed
- Type
- boolean
clearKeyDownState()
#
Clear a stored state snapshot from a key down event
- Source:
createClipboardHandler() → {ve.ce.ClipboardHandler}
#
Create a clipboard handler for the surface
- Source:
Returns:
createSlug(element)
#
Create a slug out of a DOM element
Parameters:
Name | Type | Description |
---|---|---|
element |
HTMLElement | Slug element |
- Source:
Fires:
deactivate([showAsActivated], [noSelectionChange], [hideSelection])
#
Deactivate the surface, stopping the surface observer and replacing the native range with a fake rendered one.
Used by dialogs so they can take focus without losing the original document selection.
Parameters:
Name | Type | Attributes | Default | Description |
---|---|---|---|---|
showAsActivated |
boolean |
optional |
true | Surface should still show as activated |
noSelectionChange |
boolean |
optional |
Don't change the native selection. |
|
hideSelection |
boolean |
optional |
Completely hide the selection |
- Source:
Fires:
Deactivate the surface, stopping the surface observer and replacing the native range with a fake rendered one.
decRenderLock()
#
Remove a single render lock
- Source:
destroy()
#
Destroy the surface, removing all DOM elements.
- Source:
executeSequences(sequences)
#
Execute matched sequences
Parameters:
Name | Type | Description |
---|---|---|
sequences |
Array.<ve.ui.SequenceRegistry.Match> |
- Source:
findAdjacentUneditableBranchNode(direction) → {Node|null
}
#
null
}
#
Find a ce=false branch node that a native cursor movement from here might skip
If a node is returned, then it might get skipped by a single native cursor movement in the specified direction from the closest branch node at the current cursor focus. However, if null is returned, then any single such movement is guaranteed not to skip an uneditable branch node.
Note we cannot predict precisely where/with which cursor key we might step out of the current closest branch node, because it is difficult to predict the behaviour of left/rightarrow (because of bidi visual cursoring) and up/downarrow (because of wrapping).
Parameters:
Name | Type | Description |
---|---|---|
direction |
number | 1 for before the cursor, +1 for after |
- Source:
Returns:
Potentially cursor-adjacent uneditable branch node, or null
- Type
-
Node
|
null
Find a ce=false branch node that a native cursor movement from here might skip
If a node is returned, then it might get skipped by a single native cursor movement in the specified direction from the closest branch node at the current cursor focus.
findAndExecuteDelayedSequences()
#
Check if any of the previously delayed sequences no longer match with current offset, and therefore should be executed.
- Source:
Check if any of the previously delayed sequences no longer match with current offset, and therefore should be executed.
findAndExecuteSequences([isPaste], [isDelete])
#
Find sequence matches at the current surface offset and execute them
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
isPaste |
boolean |
optional |
Whether this in the context of a paste |
isDelete |
boolean |
optional |
Whether this is after content being deleted |
- Source:
findBlockSlug(range) → {HTMLElement|null
}
#
null
}
#
Find the block slug a given range is in.
Parameters:
Name | Type | Description |
---|---|---|
range |
ve.Range | Range to check |
- Source:
Returns:
Slug, or null if no slug or if range is not collapsed
- Type
-
HTMLElement
|
null
Throws:
-
If range is inside internal list
- Type
- Error
findFocusedNode(range) → {ve.ce.Node|null
}
#
null
}
#
Find the focusedNode at a specified range
Parameters:
Name | Type | Description |
---|---|---|
range |
ve.Range | Range to search at for a focusable node |
- Source:
Returns:
Focused node
- Type
-
ve.ce.Node
|
null
findMatchingSequences([isPaste], [isDelete]) → {Array.<ve.ui.SequenceRegistry.Match>}
#
Find sequence matches at the current surface offset
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
isPaste |
boolean |
optional |
Whether this in the context of a paste |
isDelete |
boolean |
optional |
Whether this is after content being deleted |
- Source:
Returns:
fixShiftClickSelect(selectionBefore)
#
Fix shift-click selection
Support: Chrome When shift-clicking on links Chrome tries to collapse the selection so check for this and fix manually.
This can occur on mousedown or, if the existing selection covers the link, on mouseup.
Parameters:
Name | Type | Description |
---|---|---|
selectionBefore |
ve.ce.Selection | Selection before the mouse event |
- Source:
Fix shift-click selection
Support: Chrome When shift-clicking on links Chrome tries to collapse the selection so check for this and fix manually.
fixupChromiumNativeEnter()
#
Remove unwanted DOM elements from the CE view, inserted by Chromium's native Enter handling. We preventDefault an Enter keydown event, but the native handling can still happen with some IME combinations, e.g. Gboard on Android Chromium in many languages including English when there is candidate text (T312558).
- Source:
fixupCursorPosition(direction, extend)
#
Move cursor if it is between annotation nails
Parameters:
Name | Type | Description |
---|---|---|
direction |
number | Direction of travel, 1=forwards, -1=backwards, 0=unknown |
extend |
boolean | Whether the anchor should stay where it is TODO: Improve name |
- Source:
focus()
#
Give focus to the surface, reapplying the model selection, or selecting the first visible offset if the model selection is null.
This is used when switching between surfaces, e.g. when closing a dialog window. Calling this function will also reapply the selection, even if the surface is already focused.
- Source:
Give focus to the surface, reapplying the model selection, or selecting the first visible offset if the model selection is null.
forceShowModelSelection() → {boolean}
#
Apply a DM selection to the DOM, even if the old DOM selection is different but DM-equivalent
- Source:
Returns:
Whether the selection actually changed
- Type
- boolean
getActiveNode() → {ve.ce.Node|null
}
#
null
}
#
getClipboardHandler() → {ve.ce.ClipboardHandler}
#
Get the clipboard handler
- Source:
Returns:
getDocument() → {ve.ce.Document}
#
getDragDropHandler() → {ve.ce.DragDropHandler}
#
Get the drag and drop handler
- Source:
Returns:
getFocusedNode([range]) → {ve.ce.Node|null
}
#
null
}
#
Get the focused node (optionally at a specified range), or null if one is not present
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
range |
ve.Range |
optional |
Optional range to check for focused node, defaults to current selection's range |
- Source:
Returns:
Focused node
- Type
-
ve.ce.Node
|
null
getFocusedNodeDirectionality() → {string}
#
Get the directionality at the current focused node
- Source:
Returns:
'ltr' or 'rtl'
- Type
- string
getModel() → {ve.dm.Surface}
#
getNativeRange([range]) → {Range|null
}
#
null
}
#
Get a native range object for a specified ve.Range
Native ranges are only used by linear selections. They don't show whether the selection is backwards, so they should be used for measurement only.
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
range |
ve.Range |
optional |
Optional range to get the native range for, defaults to current selection's range |
- Source:
Returns:
Native range object, or null if there is no suitable selection
- Type
-
Range
|
null
Get a native range object for a specified ve.Range
Native ranges are only used by linear selections.
getOffsetFromCoords(x, y) → {number}
#
Get linear model offset from absolute coords
Parameters:
Name | Type | Description |
---|---|---|
x |
number | X offset |
y |
number | Y offset |
- Source:
Returns:
Linear model offset, or -1 if coordinates are out of bounds
- Type
- number
getOffsetFromEventCoords(e) → {number}
#
Get linear model offest from a mouse event
Parameters:
Name | Type | Description |
---|---|---|
e |
Event |
- Source:
Returns:
Linear model offset, or -1 if coordinates are out of bounds
- Type
- number
getRelativeSelectableContentOffset(startOffset, direction, [endOffset]) → {number}
#
Place the selection at the next content offset which is selectable.
For the purposes of this method, offsets within ve.ce.ActiveNode's are not considered selectable when they are not active.
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
startOffset |
number | Offset to start from |
|
direction |
number | Search direction, -1 for left and 1 for right |
|
endOffset |
number |
optional |
End offset to stop searching at |
- Source:
Returns:
Content offset, or -1 of not found
- Type
- number
getSelectedContentBranchNode() → {ve.ce.ContentBranchNode|null
}
#
null
}
#
Get the ContentBranchNode containing the selection focus, if any
- Source:
Returns:
ContentBranchNode containing selection focus, or null
- Type
-
ve.ce.ContentBranchNode
|
null
getSelectedModels([all]) → {Array.<ve.dm.Model>}
#
Get list of selected nodes and annotations.
Exclude active annotations unless the CE focus is inside a link
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
all |
boolean |
optional |
Include nodes and annotations which only cover some of the fragment |
- Source:
Returns:
Selected models
- Type
- Array.<ve.dm.Model>
getSelection([selection]) → {ve.ce.Selection}
#
Get selection view object
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
selection |
ve.dm.Selection |
optional |
Optional selection model, defaults to current selection |
- Source:
Returns:
Selection view
- Type
- ve.ce.Selection
getSelectionDirectionality() → {string}
#
Get block directionality at selection
- Source:
Returns:
'rtl' or 'ltr'
- Type
- string
getSelectionManager() → {ve.ce.SelectionManager}
#
Get the selection manager
- Source:
Returns:
getSelectionState(range) → {ve.SelectionState}
#
Get a SelectionState corresponding to a ve.Range.
If either endpoint of the ve.Range is not a cursor offset, adjust the SelectionState endpoints to be at cursor offsets. For a collapsed selection, the adjustment preserves collapsedness; for a non-collapsed selection, the adjustment is in the direction that grows the selection (thereby avoiding collapsing or reversing the selection).
Parameters:
Name | Type | Description |
---|---|---|
range |
ve.Range
|
null
|
Range to get selection for |
- Source:
Returns:
The selection
- Type
- ve.SelectionState
getSurface() → {ve.ui.Surface}
#
getViewportRange([covering], [padding]) → {ve.Range|null
}
#
null
}
#
Get an approximate range covering data visible in the viewport
It is assumed that vertical offset increases as you progress through the DM. Items with custom positioning may throw off results given by this method, so it should only be treated as an approximation.
If the document doesn't contain any content offsets (e.g. it only contains a transclusion), the returned range will cover the entire document. If the single element is particularly large this might be very distinct from the visible content.
Parameters:
Name | Type | Attributes | Default | Description |
---|---|---|---|---|
covering |
boolean |
optional |
Get a range which fully covers the viewport, otherwise get a range which is full contained within the viewport. |
|
padding |
number |
optional |
0 | Increase computed size of viewport by this amount at the top and bottom |
- Source:
Returns:
Range covering data visible in the viewport, null if the surface is not attached
- Type
-
ve.Range
|
null
Get an approximate range covering data visible in the viewport
It is assumed that vertical offset increases as you progress through the DM.
handleDataTransfer(dataTransfer, isPaste, [targetFragment]) → {boolean}
#
Handle the insertion of a data transfer object
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
dataTransfer |
DataTransfer | Data transfer |
|
isPaste |
boolean | Handlers being used for paste |
|
targetFragment |
ve.dm.SurfaceFragment |
optional |
Fragment to insert data items at, defaults to current selection |
- Source:
Returns:
One more items was handled
- Type
- boolean
handleDataTransferItems(items, isPaste, [targetFragment]) → {boolean}
#
Handle the insertion of data transfer items
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
items |
Array.<ve.ui.DataTransferItem> | Data transfer items |
|
isPaste |
boolean | Handlers being used for paste |
|
targetFragment |
ve.dm.SurfaceFragment |
optional |
Fragment to insert data items at, defaults to current selection |
- Source:
Returns:
One more items was handled
- Type
- boolean
handleInsertion()
#
Handle insertion of content.
- Source:
handleObservedChanges(oldState, newState)
#
Handle changes observed from the DOM
These are normally caused by the user interacting directly with the contenteditable.
Parameters:
Name | Type | Description |
---|---|---|
oldState |
ve.ce.RangeState
|
null
|
The prior range state, if any |
newState |
ve.ce.RangeState | The changed range state |
- Source:
Handle changes observed from the DOM
These are normally caused by the user interacting directly with the contenteditable.
hasNativeCursorSelection() → {boolean}
#
Check if the surface has a native cursor selection
On mobile platforms, this means it is likely the virtual keyboard is visible.
- Source:
Returns:
Surface has a native cursor selection
- Type
- boolean
Check if the surface has a native cursor selection
On mobile platforms, this means it is likely the virtual keyboard is visible.
incRenderLock()
#
Add a single render lock (to disable rendering)
- Source:
initialize()
#
Initialize surface.
This should be called after the surface has been attached to the DOM.
- Source:
Fires:
isBlockedTrigger(trigger) → {boolean}
#
Check if a trigger event is blocked from performing its default behaviour
If any of these triggers can't execute on the surface, (e.g. the underline command has been disabled), we should still preventDefault so ContentEditable native commands don't occur, leaving the view out of sync with the model.
Parameters:
Name | Type | Description |
---|---|---|
trigger |
ve.ui.Trigger | Trigger to check |
- Source:
Returns:
Trigger should preventDefault
- Type
- boolean
Check if a trigger event is blocked from performing its default behaviour
If any of these triggers can't execute on the surface, (e.g.
isDeactivated() → {boolean}
#
Check if the surface is deactivated.
- Source:
Returns:
Surface is deactivated
- Type
- boolean
isFocused() → {boolean}
#
Check if surface is focused.
- Source:
Returns:
Surface is focused
- Type
- boolean
isReadOnly() → {boolean}
#
isRenderingLocked() → {boolean}
#
Check whether there are any render locks
- Source:
Returns:
Render is locked
- Type
- boolean
isShownAsDeactivated() → {boolean}
#
Check if the surface is visibly deactivated.
Only true if the surface was decativated by the user in a way that is expected to change the rendering.
- Source:
Returns:
Surface is visibly deactivated
- Type
- boolean
maybeSetBreakpoint()
#
See if the just-entered content fits our criteria for setting a history breakpoint
- Source:
moveModelCursor(offset)
#
Move the DM surface cursor
Parameters:
Name | Type | Description |
---|---|---|
offset |
number | Distance to move (negative = toward document start) |
- Source:
onDocumentBeforeInput(e)
#
onDocumentBlur()
#
Handle document blur events.
This is triggered by a global focusin/focusout event noticing no selection on the document.
- Source:
Fires:
onDocumentCompositionStart(e)
#
Handle compositionstart events. Note that their meaning varies between browser/OS/IME combinations
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | The compositionstart event |
- Source:
onDocumentFocus()
#
Handle document focus events.
This is triggered by a global focusin/focusout event noticing a selection on the document.
- Source:
Fires:
onDocumentFocusInOut(e)
#
Handler for focusin and focusout events. Filters events and debounces to #onFocusChange.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | focusin/out event |
- Source:
onDocumentInput(e)
#
onDocumentKeyDown(e)
#
Handle document key down events.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Key down event |
- Source:
onDocumentKeyPress(e)
#
Handle document key press events.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Key press event |
- Source:
onDocumentKeyUp(e)
#
Handle document key up events.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Key up event |
- Source:
Fires:
onDocumentMouseDown(e)
#
Handle document mouse down events.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Mouse down event |
- Source:
onDocumentMouseUp(e)
#
Handle document mouse up events.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Mouse up event |
- Source:
onDocumentSelectionChange(e)
#
Handle document selection change events.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Selection change event |
- Source:
onFocusChange()
#
Handle global focus change.
- Source:
onInsertionAnnotationsChange(insertionAnnotations)
#
Handle insertionAnnotationsChange events on the surface model.
Parameters:
Name | Type | Description |
---|---|---|
insertionAnnotations |
ve.dm.AnnotationSet |
- Source:
onModelDocumentUpdate()
#
Handle documentUpdate events on the surface model.
- Source:
Fires:
onModelSelect()
#
Handle model select events.
- Source:
- See:
-
onSynchronizerPause()
#
Handle pause events from the synchronizer
Drops the opacity of the surface to indicate that no updates are being received from other users.
- Source:
Handle pause events from the synchronizer
Drops the opacity of the surface to indicate that no updates are being received from other users.
onSynchronizerWrongDoc()
#
Called when the synchronizer reconnects and their is a server doc ID mismatch
- Source:
onWindowResize(e)
#
Handle window resize event.
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event | Window resize event |
- Source:
Fires:
prepareClipboardHandlerForCopy(force)
#
Prepare the clipboard handler for a copy event by selecting some text
Parameters:
Name | Type | Description |
---|---|---|
force |
boolean | Force a native selection, even on mobile (used for click-to-copy) |
- Source:
removeCursorHolderAfter()
#
Remove cursorHolderAfter, if it exists
- Source:
removeCursorHolderBefore()
#
Remove cursorHolderBefore, if it exists
- Source:
removeCursorHolders()
#
Remove cursor holders, if they exist
- Source:
removeRangesAndBlur()
#
Remove all native selection ranges, and blur any active element
This should hide all virtual keyboards when present.
- Source:
Remove all native selection ranges, and blur any active element
This should hide all virtual keyboards when present.
renderSelectedContentBranchNode() → {boolean}
#
Re-render the ContentBranchNode containing the selection focus, if any
- Source:
Returns:
Whether a re-render actually happened
- Type
- boolean
restoreActiveNodeSelection() → {boolean}
#
Restore the selection from the model if expands outside the active node
This is only useful if the DOM selection and the model selection are out of sync.
- Source:
Returns:
Whether the selection was restored
- Type
- boolean
Restore the selection from the model if expands outside the active node
This is only useful if the DOM selection and the model selection are out of sync.
selectAll()
#
Select all the contents within the current context
- Source:
selectAnnotation([filter])
#
Select the inner contents of the closest annotation
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
filter |
function |
optional |
Function to filter view nodes by. |
- Source:
selectFirstSelectableContentOffset()
#
Select the first content offset which is selectable.
See #selectRelativeSelectableContentOffset for the definition of selectable.
- Source:
selectFirstVisibleStartContentOffset([fallbackToFirst])
#
Move the selection to the first visible "start content offset" in the viewport
Where "start content offset" is the first offset within a content branch node.
The following are used as fallbacks when such offsets can't be found:
- The first visible content offset (at any position in the CBN)
- The first selectable content offset in the doc (if fallbackToFirst is set)
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
fallbackToFirst |
boolean |
optional |
Whether to select the first content offset if a visible offset can't be found |
- Source:
Move the selection to the first visible "start content offset" in the viewport
Where "start content offset" is the first offset within a content branch node.
selectLastSelectableContentOffset()
#
Select the last content offset which is selectable.
See #selectRelativeSelectableContentOffset for the definition of selectable.
- Source:
selectNodeContents(node, [collapse]) → {boolean}
#
Update the selection to contain the contents of a node
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
node |
HTMLElement | ||
collapse |
string |
optional |
Collaspse to 'start' or 'end' |
- Source:
Returns:
Whether the selection changed
- Type
- boolean
selectRelativeSelectableContentOffset(startOffset, direction, [endOffset])
#
Select the offset returned by #getRelativeSelectableContentOffset
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
startOffset |
number | ||
direction |
number | ||
endOffset |
number |
optional |
- Source:
selectionSplitsNailedAnnotation() → {boolean}
#
Tests whether the selection covers part but not all of a nailed annotation
- Source:
Returns:
True if a nailed annotation is split either at the focus or at the anchor (or both)
- Type
- boolean
setActiveNode(node)
#
setContentBranchNodeChanged()
#
Inform the surface that one of its ContentBranchNodes' rendering has changed.
setDragging(dragging)
#
Set a flag when the user is dragging a selection
Parameters:
Name | Type | Description |
---|---|---|
dragging |
boolean | Dragging (mouse is down) |
- Source:
setNotUnicorning(node)
#
Release the current unicorn held by a given node, without rerendering
If the node doesn't hold the current unicorn, nothing happens.
Parameters:
Name | Type | Description |
---|---|---|
node |
ve.ce.ContentBranchNode | The node releasing the unicorn |
- Source:
Release the current unicorn held by a given node, without rerendering
If the node doesn't hold the current unicorn, nothing happens.
setNotUnicorningAll(node)
#
Ensure that no node has a unicorn.
If the given node currently has the unicorn, it will be released and no rerender will happen. If another node has the unicorn, that node will be rerendered to get rid of the unicorn.
Parameters:
Name | Type | Description |
---|---|---|
node |
ve.ce.ContentBranchNode | The node releasing the unicorn |
- Source:
setReadOnly(readOnly)
#
Set the read-only state of the surface
Parameters:
Name | Type | Description |
---|---|---|
readOnly |
boolean | Make surface read-only |
- Source:
setReviewMode(reviewMode, highlightNodes)
#
Set the review mode state of the surface
In review mode the surface can't be interacted with by the user (unlike the read-only mode where the user can select text and inspect nodes).
Review mode does not restrict changes to the model by other means, so programmatic changes can still be made from other tools.
Parameters:
Name | Type | Description |
---|---|---|
reviewMode |
boolean | Set surface to review mode |
highlightNodes |
Array.<ve.ce.Node> | Nodes to highlight while in review mode |
- Source:
Set the review mode state of the surface
In review mode the surface can't be interacted with by the user (unlike the read-only mode where the user can select text and inspect nodes).
setUnicorning(node)
#
Set the node that has the current unicorn.
If another node currently has a unicorn, it will be rerendered, which will cause it to release its unicorn.
Parameters:
Name | Type | Description |
---|---|---|
node |
ve.ce.ContentBranchNode
|
null
|
The node claiming the unicorn, null to release (by rerendering) without claiming |
- Source:
showModelSelection([force]) → {boolean}
#
Apply a DM selection to the DOM
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
force |
boolean |
optional |
Replace the DOM selection if it is different but DM-equivalent |
- Source:
Returns:
Whether the selection actually changed
- Type
- boolean
showSelectionState(selection) → {boolean}
#
Apply a selection state to the DOM
If the browser cannot show a backward selection, fall back to the forward equivalent
Parameters:
Name | Type | Description |
---|---|---|
selection |
ve.SelectionState | The selection state to show |
- Source:
Returns:
Whether the selection actually changed
- Type
- boolean
Apply a selection state to the DOM
If the browser cannot show a backward selection, fall back to the forward equivalent
storeKeyDownState(e)
#
Store a state snapshot at a keydown event, to be used in an after-keydown handler
A ve.SelectionState object is stored, but only when the key event is a cursor key. (It would be misleading to save selection properties for key events where the DOM might get modified, because anchorNode/focusNode are live and mutable, and so the offsets may come to point confusingly to different places than they did when the selection was saved).
Parameters:
Name | Type | Description |
---|---|---|
e |
jQuery.Event
|
null
|
Key down event; must be active when this call is made |
- Source:
Store a state snapshot at a keydown event, to be used in an after-keydown handler
A ve.SelectionState object is stored, but only when the key event is a cursor key.
updateActiveAnnotations([fromModelOrNode])
#
Update the activeAnnotations property and apply CSS classes accordingly
An active annotation is one containing the DOM cursor, which may not be well defined at annotation boundaries, except for links which use nails.
Also the order of .activeAnnotations may not be well defined.
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
fromModelOrNode |
boolean | Node |
optional |
If |
- Source:
Fires:
Update the activeAnnotations property and apply CSS classes accordingly
An active annotation is one containing the DOM cursor, which may not be well defined at annotation boundaries, except for links which use nails.
updateCursorHolderAfter()
#
Insert cursor holder between selection focus and preceding ce=false node, if required as a cursor target
- Source:
updateCursorHolderBefore()
#
Insert cursor holder between selection focus and subsequent ce=false node, if required as a cursor target
- Source:
updateCursorHolders()
#
Insert cursor holders, if they might be required as a cursor target
- Source:
Events
activation()
#
Surface activation state has changed (i.e. on activate or deactivate)
- Source:
blur()
#
Note that it's possible for a focus event to occur immediately after a blur event, if the focus moves to or from a FocusableNode. In this case the surface doesn't lose focus conceptually, but a pair of blur-focus events is emitted anyway.
- Source:
Note that it's possible for a focus event to occur immediately after a blur event, if the focus moves to or from a FocusableNode.
focus()
#
Note that it's possible for a focus event to occur immediately after a blur event, if the focus moves to or from a FocusableNode. In this case the surface doesn't lose focus conceptually, but a pair of blur-focus events is emitted anyway.
- Source:
Note that it's possible for a focus event to occur immediately after a blur event, if the focus moves to or from a FocusableNode.
keyup()
#
- Source:
position([wasSynchronizing])
#
When the surface or its contents changes position (only after initialize has already been called).
Parameters:
Name | Type | Attributes | Description |
---|---|---|---|
wasSynchronizing |
boolean |
optional |
The surface was positioned due to
synchronization ( |
- Source:
When the surface or its contents changes position (only after initialize has already been called).
relocationEnd()
#
- Source:
relocationStart()
#
- Source: