internal void SaveTo(StructuredText node) { node.Clear(); foreach (PreferenceItemBase t in _children) { PreferenceFolder ch_folder = t as PreferenceFolder; PreferenceFolderArray ch_array = t as PreferenceFolderArray; PreferenceItem ch_item = t as PreferenceItem; PreferenceLooseNode ch_loose = t as PreferenceLooseNode; if (ch_folder != null) { StructuredText ch = node.AddChild(ch_folder.Id); ch_folder.SaveTo(ch); } else if (ch_item != null) //item { if (ch_item.IsChanged) //デフォルト値と変わっていた場合のみ記録 { node.Set(ch_item.Id, ch_item.FormatValue()); } } else if (ch_array != null) // array { ch_array.SaveTo(node); } else if (ch_loose != null) { ch_loose.SaveTo(node.AddChild(ch_loose.Id)); } } }
//中身はValidation済みであることに注意 internal void ImportSnapshot(PreferenceFolder newvalues) { foreach (PreferenceItemBase t in _children) { PreferenceFolder child_folder = t as PreferenceFolder; if (child_folder != null) { child_folder.ImportSnapshot(newvalues.ChildAt(child_folder.Index) as PreferenceFolder); } else { PreferenceItem child_item = t as PreferenceItem; if (child_item != null) { child_item.ImportSnapshot(newvalues.ChildAt(child_item.Index) as PreferenceItem); } else { PreferenceLooseNode child_loosenode = t as PreferenceLooseNode; if (child_loosenode != null) { child_loosenode.ImportSnapshot(newvalues.ChildAt(child_loosenode.Index) as PreferenceLooseNode); } //FolderArray未サポート } } } }
internal override void ImportSnapshot(PreferenceItem item) { TypedPreferenceItem <T> i = item as TypedPreferenceItem <T>; Debug.Assert(i != null); _value = i._value; //チェック済みなのでノーイベントで }
internal abstract void ImportSnapshot(PreferenceItem item);
internal void LoadFrom(StructuredText node) { bool dirty = false; int child_index = 0; int data_index = 0; while (child_index < _children.Count) { IPreferenceItemBase child = (IPreferenceItemBase)_children[child_index]; PreferenceFolder ch_folder = child as PreferenceFolder; PreferenceFolderArray ch_array = child as PreferenceFolderArray; PreferenceItem ch_item = child as PreferenceItem; PreferenceLooseNode ch_loose = child as PreferenceLooseNode; //TODO 以下の分岐汚すぎ、何とかする if (ch_folder != null) { StructuredText ch_data = node.GetChildOrNull(data_index); //大抵はうまく整列しているので検索の手間を省く if (ch_data == null || ch_data.Name != ch_folder.Id) { dirty = true; ch_data = node.FindChild(ch_folder.Id); } else { data_index++; } if (ch_data == null) { ch_folder.ResetValue(); } else { ch_folder.LoadFrom(ch_data); } } else if (ch_item != null) { StructuredText.Entry ch_data = node.GetEntryOrNull(data_index); //大抵はうまく整列しているので検索の手間を省く if (ch_data == null || ch_data.name != ch_item.Id) { dirty = true; ch_data = node.FindEntry(ch_item.Id); } else { data_index++; } if (ch_data == null) { ch_item.ResetValue(); } else { ch_item.TryToParse(ch_data.value, PreferenceItem.ErrorMode.Reset); } } else if (ch_array != null) { ArrayList ch_data = new ArrayList(); StructuredText t = node.GetChildOrNull(data_index); if (t == null || t.Name != ch_array.Id) { dirty = true; ch_data.Clear(); ch_data.AddRange(node.FindMultipleNote(ch_array.Id)); } else //最初の一つが合格だったら継続して読み続ける { data_index++; while (t != null && t.Name == ch_array.Id) { ch_data.Add(t); t = node.GetChildOrNull(data_index++); } } ch_array.LoadFrom(ch_data); } else if (ch_loose != null) { //TODO これはFolderのときと同じだ。まとめよう StructuredText ch_data = node.GetChildOrNull(data_index); //大抵はうまく整列しているので検索の手間を省く if (ch_data == null || ch_data.Name != ch_loose.Id) { dirty = true; ch_data = node.FindChild(ch_loose.Id); } else { data_index++; } if (ch_data == null) { ch_loose.ResetValue(); } else { ch_loose.LoadFrom(ch_data); } } child_index++; //自分の子をステップ } //一度エラーなく読むことができていればdirtyはfalseのまま node.IsDirty = dirty; }