//中身は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 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)); } } }
public IPreferenceLooseNode DefineLooseNode(IPreferenceFolder parent, IPreferenceLooseNodeContent content, string id) { PreferenceFolder p = CastFolder(parent); PreferenceLooseNode n = new PreferenceLooseNode(content, p, id, parent.ChildCount); p.AddChild(n); return(n); }
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; }
internal void ImportSnapshot(PreferenceLooseNode node) { _content = node._content.Clone(); }