private void _Paste() { if (!(Selection is LayerData || Selection is GeometricObjectDataBase)) { return; } if (Clipboard == null) { return; } EnableUndoRedoStoring = false; GeometricObjectDataBase obj = Clipboard.DeepClone() as GeometricObjectDataBase; LayerData target = SelectedLayer; target.GeometricObjects.Add(obj); Action undo = () => { target.GeometricObjects.Remove(obj); }; Action redo = () => { target.GeometricObjects.Add(obj); }; UndoRedoPair urPair = new UndoRedoPair(new UndoRedoPairString(CurrentLanguage.StandardFunction.Paste + " : " + obj.Name, ""), undo, redo); EnableUndoRedoStoring = true; AddUndoRedoPair(urPair); ValidateProject(DoesUpdateShapeAuto); }
private void _AddUndoRedoPair(UndoRedoPair pair) { for (int i = 0; i < CurrentUndoDepth; i++) { _UndoRedoPairs.RemoveAt(UndoRedoCount - 1); } _UndoRedoPairs.Add(pair); CurrentUndoDepth = 0; }
/// <summary>新しいUndoRedoPairを追加する。CurrentUndoDepthが0出ない場合、現時点よりも新しいUndoRedoPairは破棄される。</summary> /// <param name="pair"></param> private void AddUndoRedoPair(UndoRedoPair pair) { string methodName = "Application.AddUndoRedoPair"; LogMethodStart(methodName); WriteLog(GetIndents(1) + "pair : " + pair.ToString()); _AddUndoRedoPair(pair); LogMethodEnd(methodName); }
/// <summary>プロジェクトデータのプロパティを変更する。変更はUndo/Redoリストに追加される。</summary> /// <param name="targetObject"></param> /// <param name="targetProperty"></param> /// <param name="newValue"></param> public void ChangeProperty(object targetObject, PropertyInfo targetProperty, object newValue) { LogMethodStart(); WriteLog(GetIndents(1) + "target object : " + targetObject.ToString()); WriteLog(GetIndents(1) + "target property : " + targetProperty.DeclaringType.FullName + "." + targetProperty.Name); WriteLog(GetIndents(1) + "new value : " + newValue.ToString()); // targetObjectがtargetPropertyを持たないクラスであればArgumentExceptionをスローする。 if (!IsTypeOf(targetObject, targetProperty.DeclaringType)) { throw new ArgumentException("Type of targetObject doesn't have property of targetProperty."); } // newValueがtargetPropertyの型でなければArgumentExceptionをスローする。 if (!IsTypeOf(newValue, targetProperty.PropertyType)) { throw new ArgumentException("Type of newValue isn't targetProperty type."); } // 現在の値。Undo作成に利用。 object oldValue = targetProperty.GetValue(targetObject); // 値の変更。 targetProperty.SetValue(targetObject, newValue); // Undo/Redoの言語対応文字列を取得する UndoRedoPairString urString; try { PropertyInfo urStringContainerGetter = typeof(LanguagePack).GetProperty(targetObject.GetType().Name) ?? typeof(LanguagePack).GetProperty(targetProperty.DeclaringType.Name); object container = urStringContainerGetter?.GetValue(CurrentLanguage); PropertyInfo urStringGetter = container?.GetType().GetProperty(targetProperty.Name + "Changed"); urString = urStringGetter.GetValue(container) as UndoRedoPairString; } catch { urString = CurrentLanguage.ProjectDataBase_PropertyChangedDefault; } // Undo/Redoの作成 Action undo = () => { targetProperty.SetValue(targetObject, oldValue); }; Action redo = () => { targetProperty.SetValue(targetObject, newValue); }; UndoRedoPair urPair = new UndoRedoPair(urString, undo, redo); AddUndoRedoPair(urPair); LogMethodEnd(); }
private void DeleteLayer(LayerData layer) { string notice = CurrentLanguage.StandardFunction.Delete_UserNotice; if (MessageBox.Show(notice, "", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) != DialogResult.OK) { return; } WaveguideDesignerProjectData parent = layer.Parent as WaveguideDesignerProjectData; int index = parent.Layers.IndexOf(layer); Action undo = () => { parent.Layers.Insert(index, layer); }; Action redo = () => { parent.Layers.Remove(layer); }; parent.Layers.Remove(layer); Selection = parent; UndoRedoPair urPair = new UndoRedoPair(new UndoRedoPairString(CurrentLanguage.StandardFunction.Delete + " : Layer[" + layer.Name + "]", ""), undo, redo); AddUndoRedoPair(urPair); }
private void DeleteGeometricObject(GeometricObjectDataBase obj) { string notice = CurrentLanguage.StandardFunction.Delete_UserNotice.Replace("%s", obj.Name); if (MessageBox.Show(notice, "", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) != DialogResult.OK) { return; } LayerData parent = obj.ParentLayer; int index = parent.GeometricObjects.IndexOf(obj); Action undo = () => { parent.GeometricObjects.Insert(index, obj); }; Action redo = () => { parent.GeometricObjects.Remove(obj); }; parent.GeometricObjects.Remove(obj); Selection = parent; UndoRedoPair urPair = new UndoRedoPair(new UndoRedoPairString(CurrentLanguage.StandardFunction.Delete + " : GeometricObject[" + obj.Name + "]", ""), undo, redo); AddUndoRedoPair(urPair); }
private void _Cut() { if (!SelectionIsStockable) { return; } Action undo, redo; GeometricObjectDataBase target = Selection as GeometricObjectDataBase; LayerData parent = target.Parent as LayerData; int index = parent.GeometricObjects.IndexOf(target); undo = () => { parent.GeometricObjects.Insert(index, target); }; redo = () => { parent.GeometricObjects.Remove(target); }; Clipboard = Selection as GeometricObjectDataBase; Clipboard.ParentLayer.GeometricObjects.Remove(Clipboard); Selection = parent; UndoRedoPair urPair = new UndoRedoPair(new UndoRedoPairString(CurrentLanguage.StandardFunction.Cut + " : " + Clipboard.ToString(), ""), undo, redo); AddUndoRedoPair(urPair); ValidateProject(DoesUpdateShapeAuto); }