/// <summary> /// 指定した RestorePropertiesAttribute に従って /// 指定したオブジェクトのプロパティの値を復元します。 /// </summary> /// <param name="obj">復元するオブジェクトを指定します。</param> /// <param name="k">復元に使用する昔の情報を持つ SettingKey を指定します。</param> /// <param name="attrs">どのプロパティを復元するかの情報を指定します。</param> private static void Restore(object obj, SettingKey k, RestorePropertiesAttribute[] attrs) { foreach (RestorePropertiesAttribute attr in attrs) { foreach (string prop in attr.props) { if (prop.IndexOf(">") >= 0) { string[] prop2 = prop.Split(new char[] { '>' }, 2); if (!k.Var.HasVariable(prop2[0])) { continue; } SetValue(obj, prop2[1], k.Var[prop2[0]]); } else { if (!k.Var.HasVariable(prop)) { continue; } SetValue(obj, prop, k.Var[prop]); } } } }
/// <summary> /// 指定したオブジェクトの型に設定された RestorePropertiesAttribute に従って /// プロパティの値を保存します。 /// </summary> /// <param name="obj">保存するオブジェクトを指定します。</param> /// <param name="k">現在の状態の保存先である SettingKey を指定します。</param> private static void Save(object obj, SettingKey k) { System.Type t = obj.GetType(); RestorePropertiesAttribute[] attrs = (RestorePropertiesAttribute[])t.GetCustomAttributes(typeof(RestorePropertiesAttribute), true); if (attrs.Length == 0) { return; } //--obj 自体の保存 Save(obj, k, attrs); //--Field の保存 object field; SettingKey kf; foreach (System.Reflection.FieldInfo f in t.GetFields(BF_FIELD)) { attrs = (RestorePropertiesAttribute[])f.GetCustomAttributes(typeof(RestorePropertiesAttribute), true); if (attrs.Length == 0) { continue; } //--準備 field = f.GetValue(obj); kf = k["F", f.Name]; //--復元 Save(field, kf, attrs); if (attrs[0].traceField) { Save(field, kf); } } }
/// <summary> /// 指定した RestorePropertiesAttribute に従って /// 指定したオブジェクトのプロパティの値を保存します。 /// </summary> /// <param name="obj">保存するオブジェクトを指定します。</param> /// <param name="k">現在の状態の保存先である SettingKey を指定します。</param> /// <param name="attrs">どのプロパティを保存するかの情報を指定します。</param> private static void Save(object obj, SettingKey k, RestorePropertiesAttribute[] attrs) { int i; string prop2; foreach (RestorePropertiesAttribute attr in attrs) { foreach (string prop in attr.props) { i = prop.IndexOf(">"); prop2 = i < 0?prop:prop.Substring(0, i); k.Var[prop2] = GetValue(obj, prop2); } } }
/// <summary> /// 名前を指定して SettingKey を取得します。 /// 対応する XML 要素がなかった場合は新しく要素を作成します。 /// </summary> public SettingKey this[string name] { get{ foreach (System.Xml.XmlElement e in this.list) { if (e.GetAttribute("name", Setting.XMLNS_KEY) == name) { return(new SettingKey(e)); } } SettingKey r = new SettingKey(this.p, this.cls, name); this.list = this.p.GetElementsByTagName(this.cls); return(r); } }
/// <summary> /// 指定したパスの SettingKey を取得します /// </summary> /// <param name="names">パスの [それぞれの階層の名前を表す文字列] の配列を指定します。 /// クラスを指定する際には "<" と ">" で囲んで名前の前に指定します</param> /// <param name="index">次に検索する名前</param> /// <returns>パスによって指定される SettingKey を返します。 /// 既存でない場合は新しく作成して返します。</returns> private SettingKey GetKey(string[] names, int index) { string cls = DEFAULT_CLASS; string name = names[index]; if (name.StartsWith("<")) { int i = name.IndexOf(">"); if (i > 0) { cls = name.Substring(1, i - 1); name = name.Substring(i + 1); } } SettingKey r = this[cls, name]; if (++index == names.Length) { return(r); } return(r.GetKey(names, index)); }
private void Initialize(System.Windows.Forms.Form form, string id, bool savesize) { if (form == null) { throw new System.ArgumentNullException("form"); } this.form = form; this.form.Load += new System.EventHandler(form_Load); this.form.FormClosing += new System.Windows.Forms.FormClosingEventHandler(form_FormClosing); string name = this.form.GetType().ToString(); if (id != null) { name += ':' + id; } this.key = Setting.Root[SETTINGKEY_NAME]["T", name]; if (this.savesize = savesize) { this.form.SizeChanged += new System.EventHandler(form_SizeChanged); this.form.LocationChanged += new System.EventHandler(form_LocationChanged); } }
//=========================================================== // 操作 //=========================================================== static Setting() { Setting.root = new SettingKey(Setting.xdoc.DocumentElement); }
/// <summary> /// VarCollection のコンストラクタ。 /// </summary> /// <param name="p">対応する SettingKey を指定します。</param> internal VarCollection(SettingKey p) { this.p = p; }