示例#1
0
        /// <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);
        }
示例#2
0
        /// <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;
        }
示例#3
0
        /// <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;
            }
        }
示例#4
0
        /// <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);
            }
        }