Esempio n. 1
0
        // --- 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);
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        // ========================================
        // 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();
                }
            }
        }
Esempio n. 4
0
        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();
        }