Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / Tools / System.Activities.Presentation / System / Activities / Presentation / Base / Interaction / Model / ModelEditingScope.cs / 1305376 / ModelEditingScope.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Activities.Presentation.Model {
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Activities.Presentation;
using System.Diagnostics.CodeAnalysis;
using System.Runtime;
///
/// A ModelEditingScope represents a group of changes to the
/// editing store. Change groups are transactional:
/// changes made under an editing scope can be committed
/// or aborted as a unit.
///
/// When an editing scope is committed, the editing store
/// takes all changes that occurred within it and applies
/// them to the model. If the editing scope�s Revert method
/// is called, or the editing scope is disposed before Complete
/// is called, the editing scope will instead reverse the
/// changes made to the underlying objects, reapplying state
/// from the editing store. This provides a solid basis for
/// an undo mechanism.
///
public abstract class ModelEditingScope : IDisposable {
private string _description;
private bool _completed;
private bool _reverted;
///
/// Creates a new ModelEditingScope object.
///
protected ModelEditingScope() { }
///
/// Describes the group. You may change this property
/// anytime before the group is committed.
///
public string Description {
get { return (_description == null ? string.Empty : _description); }
set { _description = value; }
}
///
/// Completes the editing scope. If the editing scope has
/// already been reverted or completed, this will throw an
/// InvalidOperationException. Calling Complete calls the
/// protected OnComplete method.
///
/// If ModelEditingScope
/// has already been complted or reverted.
[SuppressMessage("Microsoft.Usage", "CA1816:CallGCSuppressFinalizeCorrectly", Justification = "By design.")]
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "By design.")]
public void Complete()
{
if (_reverted) throw FxTrace.Exception.AsError(new InvalidOperationException(System.Activities.Presentation.Internal.Properties.Resources.Error_EditingScopeReverted));
if (_completed) throw FxTrace.Exception.AsError(new InvalidOperationException(System.Activities.Presentation.Internal.Properties.Resources.Error_EdtingScopeCompleted));
if (CanComplete()) {
bool successful = false;
_completed = true; // prevent recursive commits
try {
OnComplete();
successful = true;
}
catch (Exception e)
{
_completed = false;
Revert();
if (Fx.IsFatal(e))
{
throw;
}
if (!OnException(e))
{
throw;
}
}
finally {
if (successful) {
GC.SuppressFinalize(this);
}
else {
_completed = false;
}
}
}
else
Revert(); // We are not allowed to do completion, revert the change.
}
///
/// Abandons the changes made during the editing scope. If the
/// group has already been committed or aborted, this will
/// throw an InvalidOperationException. Calling Revert calls
/// the protected OnRevert with �false� for the
/// finalizing parameter.
///
/// If ModelEditingScope
/// has already been committed.
[SuppressMessage("Microsoft.Usage", "CA1816:CallGCSuppressFinalizeCorrectly", Justification = "By design.")]
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "By design.")]
public void Revert()
{
if (_completed) throw FxTrace.Exception.AsError(new InvalidOperationException(System.Activities.Presentation.Internal.Properties.Resources.Error_EdtingScopeCompleted));
if (_reverted) return;
bool successful = false;
_reverted = true;
try
{
OnRevert(false);
successful = true;
}
catch(Exception e)
{
_reverted = false;
if (Fx.IsFatal(e))
{
throw;
}
if (!OnException(e))
{
throw;
}
}
finally {
if (successful) {
GC.SuppressFinalize(this);
}
else {
_reverted = false;
}
}
}
///
/// Implements IDisposable.Dispose as follows:
///
/// 1. If the editing scope has already been completed or reverted, do nothing.
/// 2. Revert the editing scope.
///
/// GC.SuppressFinalize(this) is called through Revert(), so suppress the FxCop violation.
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1816:DisposeMethodsShouldCallSuppressFinalize")]
public void Dispose() {
Dispose(true);
}
///
/// Disposes this object by aborting changes.
///
///
protected virtual void Dispose(bool disposing) {
if (!_completed && !_reverted) {
if (disposing) {
Revert();
}
else {
OnRevert(true);
}
}
}
///
/// Performs the actual complete of the editing scope.
///
protected abstract void OnComplete();
///
/// Determines if OnComplete should be called, or if the change should instead be reverted. Reasons
/// for reverting may include file cannot be checked out of a source control system for modification.
///
/// Returns true if completion can occur, false if the change should instead revert
protected abstract bool CanComplete();
///
/// Performs the actual revert of the editing scope.
///
///
/// True if the abort is ocurring because the object
/// is being finalized. Some undo systems may attempt to
/// abort in this case, while others may abandon the
/// change and record it as a reactive undo.
///
protected abstract void OnRevert(bool finalizing);
///
/// Handle the exception during Complete and Revert.
///
///
/// The exception to handle.
///
///
/// True if the exception is handled, false if otherwise
///
protected abstract bool OnException(Exception exception);
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UnmanagedMemoryStream.cs
- DataGridViewBand.cs
- LiteralLink.cs
- LambdaCompiler.Expressions.cs
- Attributes.cs
- StringValueConverter.cs
- CachedRequestParams.cs
- IconConverter.cs
- _ListenerRequestStream.cs
- PeekCompletedEventArgs.cs
- SourceFileBuildProvider.cs
- EmptyEnumerator.cs
- _HeaderInfo.cs
- SerialPinChanges.cs
- basecomparevalidator.cs
- ChildChangedEventArgs.cs
- SiteMembershipCondition.cs
- ParameterSubsegment.cs
- ListSortDescriptionCollection.cs
- UpdatePanelControlTrigger.cs
- UIElement.cs
- KeyConverter.cs
- ElementHost.cs
- AdjustableArrowCap.cs
- InputLangChangeRequestEvent.cs
- XmlValidatingReaderImpl.cs
- DelegateArgument.cs
- ChannelCacheDefaults.cs
- MergeLocalizationDirectives.cs
- File.cs
- GroupByQueryOperator.cs
- SoapTypeAttribute.cs
- RotateTransform3D.cs
- ConsoleTraceListener.cs
- SafeRightsManagementPubHandle.cs
- UncommonField.cs
- SqlAliaser.cs
- SchemaNotation.cs
- FilterableData.cs
- DataSet.cs
- ReachDocumentReferenceSerializer.cs
- UIPermission.cs
- AnnotationStore.cs
- SchemaImporterExtensionsSection.cs
- Decimal.cs
- GatewayIPAddressInformationCollection.cs
- NetTcpSecurityElement.cs
- SqlProviderManifest.cs
- HybridObjectCache.cs
- ValidationRuleCollection.cs
- SizeF.cs
- CompilationUtil.cs
- PageContentCollection.cs
- CroppedBitmap.cs
- ThreadAbortException.cs
- SQlBooleanStorage.cs
- PlainXmlDeserializer.cs
- AsymmetricCryptoHandle.cs
- PathSegmentCollection.cs
- TextDecoration.cs
- PreDigestedSignedInfo.cs
- ResXResourceWriter.cs
- SigningProgress.cs
- BitmapPalettes.cs
- UnitySerializationHolder.cs
- PresentationSource.cs
- SurrogateSelector.cs
- EntityDataSourceReferenceGroup.cs
- PositiveTimeSpanValidator.cs
- DPAPIProtectedConfigurationProvider.cs
- ZipIOExtraField.cs
- HttpListenerException.cs
- TransportContext.cs
- SynchronizedDispatch.cs
- Wildcard.cs
- JsonGlobals.cs
- XmlSchemaAny.cs
- Menu.cs
- SetterBase.cs
- XmlValidatingReaderImpl.cs
- AutoGeneratedFieldProperties.cs
- TokenBasedSetEnumerator.cs
- WindowsFormsHelpers.cs
- DrawingCollection.cs
- Subtree.cs
- DataGrid.cs
- _Win32.cs
- DataServiceResponse.cs
- handlecollector.cs
- KoreanLunisolarCalendar.cs
- CustomErrorCollection.cs
- GenericPrincipal.cs
- PageBuildProvider.cs
- JobDuplex.cs
- Menu.cs
- CommandValueSerializer.cs
- IdleTimeoutMonitor.cs
- PropertyChangingEventArgs.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- ObjRef.cs