/// <summary> /// Replaces the selection with the content of the clipboard. /// </summary> /// <param name="isChanged">True if something was replaced or added.</param> public override void Paste(out bool isChanged) { isChanged = false; if (ClipboardHelper.TryReadNode(out Node Node)) { IFocusNodeState State = StateView.State; if ((State.ParentInner != null && State.ParentInner.InterfaceType.IsAssignableFrom(Type.FromGetType(Node))) || (State.ParentInner == null && Type.FromGetType(Node) == Type.FromGetType(State.Node))) { if (State.ParentIndex is IFocusBrowsingInsertableIndex AsInsertableIndex) { FocusController Controller = StateView.ControllerView.Controller; Node ParentNode = State.ParentInner.Owner.Node; IFocusInsertionChildIndex ReplaceIndex = (IFocusInsertionChildIndex)AsInsertableIndex.ToInsertionIndex(ParentNode, Node); Controller.Replace(State.ParentInner, ReplaceIndex, out IWriteableBrowsingChildIndex NewIndex); isChanged = true; } } } }
/// <summary></summary> protected virtual void PasteNode(INode node, out bool isChanged) { isChanged = false; IFocusControllerView ControllerView = StateView.ControllerView; if (ControllerView.Focus is IFocusTextFocus AsTextFocus) { IFocusNodeState State = AsTextFocus.CellView.StateView.State; if (State.Node.GetType().IsAssignableFrom(node.GetType())) { if (State.ParentIndex is IFocusBrowsingInsertableIndex AsInsertableIndex) { IFocusController Controller = StateView.ControllerView.Controller; INode ParentNode = State.ParentInner.Owner.Node; IFocusInsertionChildIndex ReplaceIndex = (IFocusInsertionChildIndex)AsInsertableIndex.ToInsertionIndex(ParentNode, node); Controller.Replace(State.ParentInner, ReplaceIndex, out IWriteableBrowsingChildIndex NewIndex); isChanged = true; } } } }
/// <summary> /// Checks if a node can be simplified. /// </summary> /// <param name="inner">Inner to use to replace the node upon return.</param> /// <param name="index">Index of the simpler node upon return.</param> /// <returns>True if a node can be simplified at the focus.</returns> public virtual bool IsItemSimplifiable(out IFocusInner inner, out IFocusInsertionChildIndex index) { inner = null; index = null; bool IsSimplifiable = false; IFocusNodeState CurrentState = Focus.CellView.StateView.State; // Search recursively for a simplifiable node. while (CurrentState != null) { if (NodeHelper.GetSimplifiedNode(CurrentState.Node, out Node SimplifiedNode)) { if (SimplifiedNode != null) { Type InterfaceType = CurrentState.ParentInner.InterfaceType; if (InterfaceType.IsAssignableFrom(Type.FromGetType(SimplifiedNode))) { IFocusBrowsingChildIndex ParentIndex = CurrentState.ParentIndex as IFocusBrowsingChildIndex; Debug.Assert(ParentIndex != null); inner = CurrentState.ParentInner; index = ((IFocusBrowsingInsertableIndex)ParentIndex).ToInsertionIndex(inner.Owner.Node, SimplifiedNode) as IFocusInsertionChildIndex; IsSimplifiable = true; } } break; } CurrentState = CurrentState.ParentState; } return(IsSimplifiable); }