예제 #1
0
        public void CloneChanges(ObservableCollection <MetaField> changedFields, FieldChangeTracker tracker,
                                 FieldChangeSet changes)
        {
            for (int i = 0; i < changedFields.Count; i++)
            {
                MetaField field     = changedFields[i];
                var       reflexive = field as ReflexiveData;
                bool      changed   = changes.HasChanged(field);
                if (field != null && (changed || reflexive != null))
                {
                    if (_fields[i] == null)
                    {
                        _fields[i] = field.CloneValue();
                        tracker.AttachTo(_fields[i]);
                        if (changed)
                        {
                            tracker.MarkChanged(_fields[i]);
                        }
                        tracker.MarkUnchanged(field);

                        if (reflexive != null)
                        {
                            reflexive.ResetPages();
                        }
                    }
                    else if (field != _fields[i])
                    {
                        throw new InvalidOperationException("Cannot cache changes in a meta field from a different page");
                    }
                }
            }
        }
예제 #2
0
        private void ReadField(MetaField field)
        {
            // Update the field's memory address
            var valueField = field as ValueField;

            if (valueField != null)
            {
                valueField.FieldAddress = BaseOffset + valueField.Offset;
                if (_type == LoadType.File)
                {
                    valueField.FieldAddress = _cache.MetaArea.OffsetToPointer((int)valueField.FieldAddress);
                }
            }

            // Read its contents if it hasn't changed (or if change detection is disabled)
            if (_ignoredFields == null || !_ignoredFields.HasChanged(field))
            {
                field.Accept(this);
            }

            // If it's a block, read its children
            var block = field as TagBlockData;

            if (block != null)
            {
                ReadTagBlockChildren(block);
            }
        }
예제 #3
0
		public void CloneChanges(ObservableCollection<MetaField> changedFields, FieldChangeTracker tracker,
			FieldChangeSet changes)
		{
			for (int i = 0; i < changedFields.Count; i++)
			{
				MetaField field = changedFields[i];
				var reflexive = field as ReflexiveData;
				bool changed = changes.HasChanged(field);
				if (field != null && (changed || reflexive != null))
				{
					if (_fields[i] == null)
					{
						_fields[i] = field.CloneValue();
						tracker.AttachTo(_fields[i]);
						if (changed)
							tracker.MarkChanged(_fields[i]);
						tracker.MarkUnchanged(field);

						if (reflexive != null)
							reflexive.ResetPages();
					}
					else if (field != _fields[i])
					{
						throw new InvalidOperationException("Cannot cache changes in a meta field from a different page");
					}
				}
			}
		}
예제 #4
0
        private void WriteField(MetaField field)
        {
            if (_changes == null || _changes.HasChanged(field))
            {
                field.Accept(this);
            }

            var block = field as TagBlockData;

            if (block != null)
            {
                WriteTagBlockChildren(block);
            }
        }
예제 #5
0
        private void WriteField(MetaField field)
        {
            if (_changes == null || _changes.HasChanged(field))
            {
                field.Accept(this);
            }

            var reflexive = field as ReflexiveData;

            if (reflexive != null)
            {
                WriteReflexiveChildren(reflexive);
            }
        }