// --- insert --- public void Insert(string s) { if (!_selection.IsEmpty) { var index = _selection.Offset; var cmd = new RemoveCommand(_target, _selection.Offset, _selection.Length); _executor.Execute(cmd); ReflectExecutedRange(cmd); } if (_nextInputInline != null) { _nextInputInline.Text = s; var cmd = new InsertInlineCommand(_target, _caretIndex, _nextInputInline); _executor.Execute(cmd); ReflectExecutedRange(cmd); _nextInputInline = null; } else { var cmd = new InsertStringCommand(_target, _caretIndex, s); _executor.Execute(cmd); ReflectExecutedRange(cmd); } }
public void InsertLink(string s, Link link) { _nextInputInline = null; if (!_selection.IsEmpty) { var index = _selection.Offset; var remove = new RemoveCommand(_target, _selection.Offset, _selection.Length); _executor.Execute(remove); ReflectExecutedRange(remove); } var inserting = default(Run); if (_nextInputInline != null) { inserting = _nextInputInline; inserting.Text = s; inserting.Link = link; _nextInputInline = null; } else { inserting = new Run(s, link); } var insert = new InsertInlineCommand(_target, _caretIndex, inserting); _executor.Execute(insert); ReflectExecutedRange(insert); }
// ======================================== // method // ======================================== public override void Execute() { _newStyledText = null; _oldStyledText = null; _command = null; _oldTargetAnchorId = null; if (_connectingAnchor.Kind == ConnectionAnchorKind.Source) { _command = new ConnectCommand(_target, _connectingAnchor, _newConnectableEditor, _newLocation); _command.Execute(); } else { var edge = _target.Figure as IEdge; _oldTargetAnchorId = edge.TargetConnectionOption as string; if (_newConnectableEditor == null) { _command = new ConnectCommand(_target, _connectingAnchor, _newConnectableEditor, _newLocation); _command.Execute(); } else { var node = _newConnectableEditor.Figure as INode; var model = _newConnectableEditor.Model as MemoText; _oldStyledText = model.StyledText.CloneDeeply() as StyledText.Core.StyledText; _newStyledText = model.StyledText; var charIndex = node.GetCharIndexAt(_newLocation); var inline = node.StyledText.GetInlineAt(charIndex); var anc = default(Anchor); if (inline.IsAnchorCharacter) { anc = inline as Anchor; } else { /// nodeのcharIndex位置にAnchor追加 anc = new Anchor(); var insertAnchorCommand = new InsertInlineCommand(_newStyledText, charIndex, anc); insertAnchorCommand.Execute(); } _newTargetAnchorId = anc.Id; edge.TargetConnectionOption = _newTargetAnchorId; _command = new ConnectCommand(_target, _connectingAnchor, _newConnectableEditor, _newLocation); _command.Execute(); } } }
private void SetUp(IEditor createdEditor, object model) { _newStyledText = null; _oldStyledText = null; /// 親controllerへの通知 var containerCtrl = _target.Controller as IContainerController; Contract.Requires( containerCtrl != null && containerCtrl.CanContainChild(_modelFactory.ModelDescriptor) ); var createdConnectionCtrl = createdEditor.Controller as IConnectionController; var createdEdge = createdEditor.Figure as IEdge; if (createdEditor == null || createdConnectionCtrl == null || createdEdge == null) { /// rollback containerCtrl.RemoveChild(model); _target.RemoveChildEditor(createdEditor); throw new ArgumentException(); } var srcConnectableCtrl = _edgeSourceEditor == null? null: _edgeSourceEditor.Controller as IConnectableController; var srcConnectableFig = _edgeSourceEditor == null? null: _edgeSourceEditor.Figure as IConnectable; var tgtConnectableCtrl = _edgeTargetEditor == null? null: _edgeTargetEditor.Controller as IConnectableController; var tgtConnectableFig = _edgeTargetEditor == null? null: _edgeTargetEditor.Figure as IConnectable; /// パラメタの妥当性検査 var isValidSrcConnect = _edgeSourceEditor != null && srcConnectableFig != null && createdConnectionCtrl.CanConnectSource(_edgeSourceEditor.Model); var isValidSrcDisconnect = (_edgeSourceEditor == null || srcConnectableCtrl == null || !createdConnectionCtrl.CanConnectSource(_edgeSourceEditor.Model) ) && createdConnectionCtrl.CanDisconnectSource; var isValidSrc = isValidSrcConnect || isValidSrcDisconnect; var isValidTgtConnect = _edgeTargetEditor != null && tgtConnectableCtrl != null && createdConnectionCtrl.CanConnectTarget(_edgeTargetEditor.Model); var isValidTgtDisconnect = (_edgeTargetEditor == null || tgtConnectableCtrl == null || !createdConnectionCtrl.CanConnectTarget(_edgeTargetEditor.Model) ) && createdConnectionCtrl.CanDisconnectTarget; var isValidTgt = isValidTgtConnect || isValidTgtDisconnect; if (!isValidSrc || !isValidTgt) { /// rollback containerCtrl.RemoveChild(model); _target.RemoveChildEditor(createdEditor); throw new ArgumentException(); } /// controllerの通知 if (isValidSrcConnect) { createdConnectionCtrl.ConnectSource(_edgeSourceEditor.Model); srcConnectableCtrl.ConnectOutgoing(model); } if (isValidTgtConnect) { createdConnectionCtrl.ConnectTarget(_edgeTargetEditor.Model); tgtConnectableCtrl.ConnectIncoming(model); var node = _edgeTargetEditor.Figure as INode; var mtext = _edgeTargetEditor.Model as MemoText; _oldStyledText = mtext.StyledText.CloneDeeply() as StyledText.Core.StyledText; _newStyledText = mtext.StyledText; var charIndex = node.GetCharIndexAt(_edgePoints.Last()); var inline = node.StyledText.GetInlineAt(charIndex); var anc = default(Anchor); if (inline.IsAnchorCharacter) { anc = inline as Anchor; } else { /// nodeのcharIndex位置にAnchor追加 anc = new Anchor(); var insertAnchorCommand = new InsertInlineCommand(_newStyledText, charIndex, anc); insertAnchorCommand.Execute(); } var edge = createdEdge; _newTargetAnchorId = anc.Id; _oldTargetAnchorId = edge.TargetConnectionOption as string; edge.TargetConnectionOption = _newTargetAnchorId; var connectCommand = new ConnectCommand(createdEditor, createdEdge.TargetAnchor, _edgeTargetEditor, _edgePoints.Last()); connectCommand.Execute(); } /// figureの編集 createdEdge.SetEdgePoints(_edgePoints); createdEdge.Route(); if (isValidSrcConnect) { createdEdge.Source = srcConnectableFig; } if (isValidTgtConnect) { createdEdge.Target = tgtConnectableFig; } createdEditor.Enable(); }