// ======================================== // method // ======================================== // === IRole ========== public override bool CanUnderstand(IRequest request) { if (request.Id != RequestIds.Paste) { return(false); } var data = Clipboard.GetDataObject(); foreach (var provider in _FormatAndPasters) { var format = DataFormats.GetFormat(provider.Item1); if (data.GetDataPresent(format.Name)) { return(true); } } return(EditorFactory.CanRestoreDataObject(data, _Host)); }
// ======================================== // method // ======================================== public override void Execute() { var container = _target.Controller as IContainerController; if (container == null) { return; } var data = Clipboard.GetDataObject(); if (EditorFactory.CanRestoreDataObject(data)) { /// Editorを復元 _pastedEditors = EditorFactory.RestoreDataObject(data, _target.Site.ControllerFactory); /// 一番左上の位置計算 var left = int.MaxValue; var top = int.MaxValue; foreach (var editor in _pastedEditors) { if (container.CanContainChild(editor.Controller.ModelDescriptor)) { left = left < editor.Figure.Left? left: editor.Figure.Left; top = top < editor.Figure.Top? top: editor.Figure.Top; } } /// 各editorの移動量 var moveDelta = new Size(_location.X - left, _location.Y - top); /// _targetに追加 foreach (var editor in _pastedEditors) { if (container.CanContainChild(editor.Controller.ModelDescriptor)) { editor.Figure.Location += moveDelta; _target.AddChildEditor(editor); container.InsertChild(editor.Model, container.ChildCount); editor.Enable(); } } /// Route()だけやり直し foreach (var editor in _pastedEditors) { if (editor.Figure is LineEdge) { var edge = editor.Figure as LineEdge; edge.Route(); } } } else if (_format != null && _creator != null) { /// 一般的なフォーマットから復元 var format = DataFormats.GetFormat(_format); if (data.GetDataPresent(format.Name)) { _pastedEditors = _creator(_target, _location, _description); } } }