/// <summary> /// シリアライズ用に実体としてインスタンスを生成する(_parentの参照もコピーする) /// </summary> /// <param name="value">元になるIRichPane</param> /// <returns>新しいインスタンス</returns> public static RichPaneBinder CreateCopyComplete(IRichPane value) { var ret = new RichPaneBinder { _parent = value, _zoom = value.Zoom, _scroll = value.Scroll, _idtext = value.IdText }; return(ret); }
/// <summary> /// パーツを指定してインスタンスを初期化する /// </summary> /// <param name="parts"></param> /// <param name="pane"></param> public void AddParts(PartsBase parts, IRichPane pane, CodePos offset) { _lastDevelpType = DevelopType.Unknown; var p = new Pos3 { OrgPane = RichPaneBinder.CreateCopyComplete(pane), NowPane = pane, Org = (CodeRect)parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) //p.Org = (uCdRect)parts.Rect.Clone() - parts.GetCdPos(pane, _prevShift); // 符号化の座標(符号しない場合、単なるパーツ座標) Pre = (CodeRect)parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Now = (CodeRect)parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Offset = (CodePos)offset.Clone() }; base[parts] = p; }
/// <summary> /// インスタンスを初期化する /// </summary> /// <param name="with">基準位置とパーツの種類の元情報</param> /// <param name="pane">基準位置のスクロールとズーム値を記憶するためのインプット</param> public void Initialize(PartsCollectionBase with) { Clear(); _lastDevelpType = DevelopType.Unknown; foreach (PartsCollectionBase.PartsEntry pe in with) { var p = new Pos3 { OrgPane = RichPaneBinder.CreateCopyComplete(pe.Pane), NowPane = pe.Pane, Org = (CodeRect)pe.Parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Pre = (CodeRect)pe.Parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Now = (CodeRect)pe.Parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Offset = CodePos.FromInt(0, 0) }; base[pe.Parts] = p; } }
/// <summary> /// 指定ストリームにオブジェクトを送信する、サイクリックループ /// </summary> /// <param name="writer">ストリーム</param> /// <param name="value">オブジェクト</param> private static void sendLoop(Stream writer, object value) { // 送信できない型を変換する if (value != null) { if (value is EventHandler) { value = null; } if (value is IRichPane && value.GetType() != typeof(RichPaneBinder)) { value = RichPaneBinder.CreateCopy((IRichPane)value); } if (value is System.Windows.Forms.Form) { value = null; } if (value is PartsBase) { ((PartsBase)value).SetPartsPositionCorderName(true); ((PartsBase)value).SetPartsPositionerName(true); } } // ヌル値の処理 if (value == null) { writer.WriteByte((byte)Tag.Null); return; } var tarType = value.GetType(); var ttag = _typeToTag[tarType]; if (ttag != null) { // タグの埋め込み writer.WriteByte((byte)ttag); // 値の埋め込み var mi = typeof(SerializerEx).GetMethod("SendDirect", new Type[] { typeof(Stream), tarType }); mi.Invoke(null, new object[] { writer, value }); return; } // クラスID var cid = NamedId.FromName(tarType.FullName); var isClassProced = false; IDictionary dupchk = new HybridDictionary(); // リストの特化処理 if (value is IList) { // タグの埋め込み writer.WriteByte((byte)Tag.List); // クラスID SendDirect(writer, cid); SendDirect(writer, ((IList)value).Count); for (var i = 0; i < ((IList)value).Count; i++) { sendLoop(writer, ((IList)value)[i]); } isClassProced = true; } // ディクショナリの特化処理 if (value is IDictionary) { // タグの埋め込み writer.WriteByte((byte)Tag.Dictionary); // クラスID SendDirect(writer, cid.Id.Value); SendDirect(writer, ((IDictionary)value).Count); foreach (DictionaryEntry de in ((IDictionary)value)) { sendLoop(writer, de.Key); sendLoop(writer, de.Value); } isClassProced = true; } // クラスの処理 if (isClassProced == false) { writer.WriteByte((byte)Tag.ClassStart); SendDirect(writer, cid.Id.Value); } else { // リスト、ディクショナリ系で、派生クラスのフィールドは保存不要と記し付ける for (var type = tarType; type != typeof(object); type = type.BaseType) { if (type.Namespace.StartsWith("System.") == false) { continue; } const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; var fis = type.GetFields(flags); foreach (var fi in fis) { if (fi.DeclaringType != fi.ReflectedType) { continue; // 派生クラスの保存フェーズで行う } if ((fi.Attributes & FieldAttributes.NotSerialized) == 0) { dupchk[fi.Name] = true; } } } } // ~クラスフィールドの処理 var inheritLevel = 0; for (var type = tarType; type != typeof(object); type = type.BaseType) { var fcnt = 0; const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; var fis = type.GetFields(flags); foreach (var fi in fis) { if (fi.DeclaringType != fi.ReflectedType) { continue; // 派生クラスの保存フェーズで行う } if ((fi.Attributes & FieldAttributes.NotSerialized) == 0) { if (dupchk[fi.Name] == null) { dupchk.Add(fi.Name, true); if (fcnt == 0 && inheritLevel > 0) // ベースクラス初めてのフィールドの時。 { // ベースクラス開始TAGを埋め込む writer.WriteByte((byte)Tag.SubClass); // クラス派生先識別IDを埋め込む var bid = NamedId.FromName(type.FullName); SendDirect(writer, bid.Id.Value); } // タグの埋め込み writer.WriteByte((byte)Tag.Field); // フィールド名を埋め込む var fid = NamedId.FromName($"{type.FullName}...{fi.Name}"); //.FromField(fi); SendDirect(writer, fid.Id.Value); // フィールドの値を埋め込む sendLoop(writer, fi.GetValue(value)); fcnt++; } } } inheritLevel++; } // クラス終了TAGを埋め込む writer.WriteByte((byte)Tag.ClassEnd); // シリアライズ終了時の開放処理等 if (value is PartsBase) { ((PartsBase)value).SetPartsPositionCorderName(false); ((PartsBase)value).SetPartsPositionerName(false); } }