Example #1
0
 //中身は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未サポート
             }
         }
     }
 }
Example #2
0
        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));
                }
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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;
        }
Example #5
0
 internal void ImportSnapshot(PreferenceLooseNode node)
 {
     _content = node._content.Clone();
 }