public void AnyPropertyOfCardsChangedTest()
        {
            var container = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                Left = 1, Top = 10, Width = 300, Height = 3000,
            };
            var button0 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };
            var button1 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Static,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };

            container.Items.Add(button0);
            container.Items.Add(button1);

            container.AnyPropertyOfAnyChildChanged += (sender, e) =>
            {
                Assert.AreSame(e.Child, button0);
                Assert.AreEqual("IsClickable", e.PropertyName);
                Assert.Pass();
            };

            button0.IsClickable = !button0.IsClickable;
            Assert.Fail();
        }
        public AnkimonRowContainer()
        {
            Position = DrawingObjectPosition.Relative;
            Height = WordCard.WordCardHeight;
            var label = new EigoTestLabelItem()
            {
                Width = 100, Height = WordCard.WordCardHeight,
            };
            Items.Add(label);

            var wordCardContainer = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = label.OuterWidth,
            };
            var wordCardCollection = (DrawingObjectCollection)wordCardContainer.Items;
            wordCardCollection.CollectionChanged += (sender, e) =>
            {
                PropertyChangedEventHandler propertyChanged = (xx, x) =>
                {
                    if ("Width" != x.PropertyName) return;
                    WordCardの整列((IList<EigoTestDrawingObject>)sender);
                };
                if (null != e.NewItems)
                {
                    foreach (var newItem in e.NewItems.Cast<WordCard>())
                    {
                        newItem.Position = DrawingObjectPosition.Absolute;
                        newItem.MarginLeft = WordCardMarginLeft;
                        newItem.MarginTop = 0;
                        newItem.MarginRight = 0;
                        newItem.MarginBottom = 0;
                        newItem.PropertyChanged += propertyChanged;
                    }
                }
                if (null != e.OldItems)
                {
                    foreach (var oldItem in e.OldItems.Cast<WordCard>())
                    {
                        oldItem.PropertyChanged -= propertyChanged;
                    }
                }
                WordCardの整列((IList<EigoTestDrawingObject>)sender);
            };
            Items.Add(wordCardContainer);

            ((DrawingObjectCollection)Items).CollectionChanged += (sender, e) =>
            {
                throw new InvalidOperationException("AnkimonRowContainerの構成要素は変更できません。");
            };
        }
        public InformationState(EPuzzleWindow window, WindowState parentState, string text)
            : base(window)
        {
            _parentState = parentState;
            var container = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Width = DrawingObjectRoot.Width / 2f,
                Height = DrawingObjectRoot.Height / 2f,
            //				BackColor =
            };
            Items.Add(container);

            _textLabel = new EigoTestLabelItem()
            {
                Text = text,
            //				Width = container.Width,
                Height = container.Height * 0.8f,
                BackColor = EPuzzleColors.ColorAlpha01,
            };
            container.Items.Add(_textLabel);

            var okButton = new EigoTestButtonItem()
            {
                Text = "OK", Name = "ok",
            //				Width = 100,
                Height = 60,
            };
            container.Items.Add(okButton);
            container.水平方向に中央揃え();
            container.垂直方向に中央揃え();

            Action0 += (sender, e) =>
            {
                if (null == CurrentItem) return;
                if ("ok" == CurrentItem.Name)
                {
                    Window.State = parentState;
                }
            };
        }
        public void AttachedDettachedTest()
        {
            var container = new DrawingObjectContainer()
            {
                Left = 1, Top = 10, Width = 300, Height = 3000,
            };
            var button0 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };

            var flag0 = false;
            var flag1 = false;
            button0.Attached += (sender, e) =>
            {
                flag0 = true;
            };
            button0.Detached += (sender, e) =>
            {
                flag1 = true;
            };

            flag0 = false;
            container.Items.Add(button0);
            Assert.True(flag0);

            flag1 = false;
            container.Items.Remove(button0);
            Assert.True(flag1);

            flag1 = false;
            container.Items.Add(button0);
            container.Items.Clear();
            Assert.True(flag1);
        }
        public void GetAllItemsTest()
        {
            var testState = new Fish.eigotest.TestState(null);
            var drawingObjectContainer1 = new DrawingObjectContainer();
            var drawingObjectContainer2 = new DrawingObjectContainer();
            var eigoTestLabelItem = new EigoTestLabelItem();

            drawingObjectContainer2.Items.Add(eigoTestLabelItem);
            drawingObjectContainer1.Items.Add(drawingObjectContainer2);
            testState.Items.Add(drawingObjectContainer1);

            Assert.AreEqual(3, testState.GetAllItems().Count());
        }
        public void 資格のなくなったCurrentItemを変更する()
        {
            var window = new EPuzzleWindow();
            var testState = new Fish.eigotest.TestState(window);
            Assert.Null(testState.CurrentItem);
            var b0 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 100, Top = 100, Width = 10, Height = 10,
            };
            Assert.Null(b0.GetState());
            testState.Items.Add(b0);
            window.State = testState;
            Assert.AreSame(b0, testState.CurrentItem);
            Assert.Null(testState.DrawingObjectRoot.Parent);
            Assert.AreSame(testState, testState.DrawingObjectRoot.GetState());
            Assert.AreSame(testState, b0.GetState());

            testState.Items.RemoveAt(0);
            Assert.AreEqual(0, testState.Items.Count());
            Assert.Null(testState.CurrentItem);

            var b1 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 200, Top = 100, Width = 10, Height = 10,
            };
            testState.Items.Add(b0);
            testState.Items.Add(b1);
            Assert.AreSame(b0, testState.CurrentItem);

            b0.IsClickable = false;
            Assert.AreSame(b1, testState.CurrentItem);
            testState.Items.Remove(b1);

            Assert.Null(testState.CurrentItem);

            // 同じコレクション内のアイテムを優先する
            b0.IsClickable = true;
            var b2 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 300, Top = 100, Width = 10, Height = 10,
            };
            var container = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 200, Top = 100, Width = 500, Height = 500,
            };

            container.Items.Add(b1);
            container.Items.Add(b2);
            testState.Items.Add(container);

            Assert.AreSame(b0, testState.CurrentItem);
            testState.CurrentItem = b1;

            b1.IsClickable = false;
            Assert.AreSame(b2, testState.CurrentItem);

            // 同じコレクション内のアイテムで座標が近いものを優先する
            b1.IsClickable = true;
            b2.IsClickable = true;
            var b3 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 301, Top = 100, Width = 10, Height = 10,
            };
            container.Items.Add(b3);
            testState.CurrentItem = b2;
            b2.IsClickable = false;
            Assert.AreSame(b3, testState.CurrentItem);

            // 同じコレクション内になければすべての先頭から選択する
            b1.IsClickable = false;
            b2.IsClickable = false;
            b3.IsClickable = false;
            Assert.AreSame(b0, testState.CurrentItem);
        }
        public void DrawingObjectの位置交換()
        {
            var window = new EPuzzleWindow();
            var state = new WindowState(window);
            window.State = state;

            var container0 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                MarginLeft = 1f, MarginTop = 10f,
                Height = 100,
            };
            state.Items.Add(container0);
            var container1 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                MarginLeft = 1f, MarginTop = 10f,
                Height = 100,
            };
            state.Items.Add(container1);

            var a = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Width = 10, Height = 100,
                Name = "a",
            };
            container0.Items.Add(a);
            var b = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 0, Top = 0,
                Width = 20, Height = 100,
                Name = "b",
            };
            container1.Items.Add(b);
            var c = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 21, Top = 0,
                Width = 10, Height = 100,
                Name = "c",
            };
            container1.Items.Add(c);

            // container0
            Assert.AreEqual(1, container0.BorderLeft);
            Assert.AreEqual(10, container0.BorderTop);
            Assert.AreEqual(100, container0.Height);
            CollectionAssert.AreEqual(new [] { a, }, container0.Items);

            // container1
            Assert.AreEqual(1, container1.BorderLeft);
            Assert.AreEqual(120, container1.BorderTop);
            Assert.AreEqual(100, container1.Height);
            CollectionAssert.AreEqual(new [] { b, c, }, container1.Items);

            // a
            Assert.AreEqual("a", a.Name);
            Assert.AreEqual(1, a.OuterLeft);
            Assert.AreEqual(10, a.OuterTop);
            Assert.AreEqual(11, a.OuterRight);
            Assert.AreEqual(110, a.OuterBottom);

            // b
            Assert.AreEqual("b", b.Name);
            Assert.AreEqual(1, b.OuterLeft);
            Assert.AreEqual(120, b.OuterTop);
            Assert.AreEqual(21, b.OuterRight);
            Assert.AreEqual(220, b.OuterBottom);

            // c
            Assert.AreEqual("c", c.Name);
            Assert.AreEqual(22, c.OuterLeft);
            Assert.AreEqual(120, c.OuterTop);
            Assert.AreEqual(32, c.OuterRight);
            Assert.AreEqual(220, c.OuterBottom);

            WindowState.NowObject = new TestNowObject();
            WindowState.NowObject.Now = DateTime.MinValue;

            var idouJikan = TimeSpan.FromSeconds(1d);
            state.場所の入れ換え(a, c, idouJikan);

            var aa = state.Items.Single(x => "a" == x.Name);
            var cc = state.Items.Single(x => "c" == x.Name);

            Assert.False(a.IsClickable);
            Assert.False(a.IsVisible);
            Assert.False(c.IsClickable);
            Assert.False(c.IsVisible);

            Assert.False(aa.IsClickable);
            Assert.True(aa.IsVisible);
            Assert.AreEqual(DrawingObjectPosition.Absolute, aa.Position);
            Assert.AreSame(state.DrawingObjectRoot, aa.Parent);
            Assert.AreEqual(a.OuterLeft, aa.OuterLeft);
            Assert.AreEqual(a.OuterTop, aa.OuterTop);
            Assert.AreEqual(a.OuterWidth, aa.OuterWidth);

            Assert.False(cc.IsClickable);
            Assert.True(cc.IsVisible);
            Assert.AreEqual(DrawingObjectPosition.Absolute, cc.Position);
            Assert.AreSame(state.DrawingObjectRoot, cc.Parent);
            Assert.AreEqual(c.OuterLeft, cc.OuterLeft);
            Assert.AreEqual(c.OuterTop, cc.OuterTop);
            Assert.AreEqual(c.OuterWidth, cc.OuterWidth);

            // 移動中
            WindowState.NowObject.Now += TimeSpan.FromTicks((int)Math.Round(idouJikan.Ticks * 0.5f));
            window.Tick();

            Assert.AreEqual(c.OuterLeft + (a.OuterLeft - c.OuterLeft) * 0.5f, cc.OuterLeft, 0.1f);
            Assert.AreEqual(c.OuterTop + (a.OuterTop - c.OuterTop) * 0.5f, cc.OuterTop, 0.1f);
            Assert.AreEqual(c.Width + (a.Width - c.Width) * 0.5f, c.Width, 0.1f);

            Assert.AreEqual(a.OuterLeft + (c.OuterLeft - a.OuterLeft) * 0.5f, aa.OuterLeft, 0.1f);
            Assert.AreEqual(a.OuterTop + (c.OuterTop - a.OuterTop) * 0.5f, aa.OuterTop, 0.1f);
            Assert.AreEqual(a.Width + (c.Width - a.Width) * 0.5f, a.Width, 0.1f);

            // 場所の入れ換え完了
            WindowState.NowObject.Now += idouJikan;
            window.Tick();

            CollectionAssert.DoesNotContain(state.GetAllItems(), a);
            CollectionAssert.DoesNotContain(state.GetAllItems(), c);
            Assert.Null(a.Parent);
            Assert.Null(c.Parent);
            CollectionAssert.AreEqual(new [] { cc, }, container0.Items);
            CollectionAssert.AreEqual(new [] { b, aa }, container1.Items);
            Assert.True(aa.IsClickable);
            Assert.True(aa.IsVisible);
            Assert.True(cc.IsClickable);
            Assert.True(cc.IsVisible);

            // cc
            Assert.AreEqual("c", cc.Name);
            Assert.AreEqual(1, cc.OuterLeft);
            Assert.AreEqual(10, cc.OuterTop);
            Assert.AreEqual(11, cc.OuterRight);
            Assert.AreEqual(110, cc.OuterBottom);

            // aa
            Assert.AreEqual("a", aa.Name);
            Assert.AreEqual(22, aa.OuterLeft);
            Assert.AreEqual(120, aa.OuterTop);
            Assert.AreEqual(32, aa.OuterRight);
            Assert.AreEqual(220, aa.OuterBottom);
        }
        public WindowState(EPuzzleWindow window)
        {
            Window = window;
            NextStates = new List<WindowState>(); //new EigoTestStateCollection(this);
            PreviousStates = new List<WindowState>();
            DrawingPreparers = new List<DrawingPreparer>();

            _drawingObjectRoot = new DrawingObjectContainer()
            {
                Width = 1024,
                Height = 768,
                Position = DrawingObjectPosition.Relative,
                Color = Color.FromArgb(0xff, 0x00, 0x00, 0x80),
            };
            _drawingObjectRoot.SetState(this);

            MoveUp += (sender, e) =>
            {
                if (null == CurrentItem)
                {
                    CorrectCurrentItem();
                    return;
                }
                MoveCursor(x => CurrentItem.BorderTop > x.BorderTop, x => CurrentItem.BorderLeft == x.BorderLeft);
            };
            MoveDown += (sender, e) =>
            {
                if (null == CurrentItem)
                {
                    CorrectCurrentItem();
                    return;
                }
                MoveCursor(x => CurrentItem.BorderTop < x.BorderTop, x => CurrentItem.BorderLeft == x.BorderLeft);
            };
            MoveLeft += (sender, e) =>
            {
                if (null == CurrentItem)
                {
                    CorrectCurrentItem();
                    return;
                }
                MoveCursor(x => CurrentItem.BorderLeft > x.BorderLeft, x => CurrentItem.BorderTop == x.BorderTop);
            };
            MoveRight += (sender, e) =>
            {
                if (null == CurrentItem)
                {
                    CorrectCurrentItem();
                    return;
                }
                MoveCursor(x => CurrentItem.BorderLeft < x.BorderLeft, x => CurrentItem.BorderTop == x.BorderTop);
            };
            Action0 += (sender, e) =>
            {
                if (null == CurrentItem) return;
                CurrentItem.OnClick(new MouseEventInfo(MouseButtons.Left));
            };
        }
        public void LeftTopTest()
        {
            var container1 = new DrawingObjectContainer();
            container1.Width = 1;
            container1.Height = 2;
            Assert.AreEqual(new SizeF(1, 2), container1.Size);

            container1.Size = new SizeF(3, 4);
            Assert.AreEqual(3, container1.Width);
            Assert.AreEqual(4, container1.Height);
        }
        public void PreviousItemがAbsoluteだった場合()
        {
            var container = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                Left = 1, Top = 10, Width = 300, Height = 3000,
            };
            var button0 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };
            var button1 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Static,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };

            container.Items.Add(button0);
            container.Items.Add(button1);

            CollectionAssert.AreEqual(new [] { button0, }, button1.GetPreviousItems());
            Assert.AreEqual(2, button0.OuterLeft);
            Assert.AreEqual(20, button0.OuterTop);
            Assert.AreEqual(1, button1.OuterLeft);
            Assert.AreEqual(10, button1.OuterTop);
        }
        public void Test4()
        {
            var container = new DrawingObjectContainer()
            {
                Left = 1, Top = 10, Width = 300, Height = 3000,
            };
            Assert.AreEqual(DrawingObjectPosition.Static, container.Position);

            var button1 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };
            var button2 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };
            container.Items.Add(button1);
            container.Items.Add(button2);

            // container.Position == Relative
            // button1.Position == Absolute
            // button2.Position == Absolute
            container.Position = DrawingObjectPosition.Relative;
            Assert.AreEqual(DrawingObjectPosition.Relative, container.Position);
            Assert.AreSame(container, button1.GetContainingBlock());
            Assert.AreEqual(2, button1.OuterLeft);
            Assert.AreEqual(20, button1.OuterTop);
            Assert.AreEqual(200, button1.OuterWidth);

            Assert.AreEqual(2, button2.OuterLeft);
            Assert.AreEqual(20, button2.OuterTop);
            Assert.AreEqual(200, button2.OuterWidth);

            // container.Position == Static
            // button1.Position == Absolute
            // button2.Position == Absolute
            container.Position = DrawingObjectPosition.Static;
            Assert.AreEqual(DrawingObjectPosition.Static, container.Position);
            Assert.Null(button1.GetContainingBlock());
            Assert.AreEqual(1, button1.OuterLeft);
            Assert.AreEqual(10, button1.OuterTop);
            Assert.AreEqual(200, button1.OuterWidth);

            Assert.AreEqual(1, button2.OuterLeft);
            Assert.AreEqual(10, button2.OuterTop);
            Assert.AreEqual(200, button2.OuterWidth);

            // container.Position == Static
            // button1.Position == Static
            // button2.Position == Static
            {
                container.Position = DrawingObjectPosition.Static;
                button1.Position = DrawingObjectPosition.Static;
                button2.Position = DrawingObjectPosition.Static;
                Assert.AreEqual(DrawingObjectPosition.Static, container.Position);
                Assert.Null(button1.GetContainingBlock());

                Assert.AreEqual(1, button1.OuterLeft);
                Assert.AreEqual(10, button1.OuterTop);
                Assert.AreEqual(200, button1.OuterWidth);

                Assert.AreEqual(1, button2.OuterLeft);
                Assert.AreEqual(110, button2.OuterTop);
                Assert.AreEqual(200, button2.OuterWidth);

                // Width
                button1.SetWidthNull();
                Assert.AreEqual(300, button1.Width);
                button1.MarginLeft = 10;
                Assert.AreEqual(290, button1.Width);

                // 上下マージン相殺
                button1.MarginBottom = 30f;
                button2.MarginTop = 20f;
                Assert.AreEqual(1, button2.OuterLeft);
                Assert.AreEqual(120, button2.OuterTop);

                // 上下マージン相殺
                button1.MarginBottom = 20f;
                button2.MarginTop = 30f;
                Assert.AreEqual(1, button2.OuterLeft);
                Assert.AreEqual(110, button2.OuterTop);
            }
        }
        public void 中央揃えテスト()
        {
            var container = new DrawingObjectContainer()
            {
                Width = 100f, Height = 1000f,
            };
            var button = new EigoTestButtonItem()
            {
                Width = 10f, Height = 100f,
            };
            container.Items.Add(button);
            Assert.AreSame(container, button.Parent);
            Assert.AreEqual(new PointF(0f, 0f), button.Location);

            button.水平方向に中央揃え();
            Assert.AreEqual(new PointF(45f, 0f), button.Location);

            button.垂直方向に中央揃え();
            Assert.AreEqual(new PointF(45f, 450f), button.Location);

            button.右揃え();
            Assert.AreEqual(new PointF(90f, 450f), button.Location);

            button.下揃え();
            Assert.AreEqual(new PointF(90f, 900f), button.Location);
        }
        public void 包含ブロックの幅が足りないときは次の行へ()
        {
            var window = new EPuzzleWindow();
            var windowState = new WindowState(window);
            window.State = windowState;
            var container = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1f, Top = 10f,
                Width = 25f, Height = 1000f,
            };
            var button0 = new EigoTestButtonItem()
            {
                Floating = DrawingObjectFloating.Left,
                Width = 10f, Height = 100f,
            };
            var button1 = new EigoTestButtonItem()
            {
                Floating = DrawingObjectFloating.Left,
                Width = 10f, Height = 100f,
            };
            var button2 = new EigoTestButtonItem()
            {
                Floating = DrawingObjectFloating.Left,
                Width = 10f, Height = 100f,
            };
            var button3 = new EigoTestButtonItem()
            {
                Floating = DrawingObjectFloating.Left,
                Width = 10f, Height = 100f,
            };
            window.State.Items.Add(container);
            container.Items.Add(button0);
            container.Items.Add(button1);
            container.Items.Add(button2);
            container.Items.Add(button3);

            Assert.AreEqual(1f, button0.OuterLeft);
            Assert.AreEqual(10f, button0.OuterTop);

            Assert.AreEqual(11f, button1.OuterLeft);
            Assert.AreEqual(10f, button1.OuterTop);

            Assert.AreEqual(1f, button2.OuterLeft);
            Assert.AreEqual(110f, button2.OuterTop);

            Assert.AreEqual(11f, button3.OuterLeft);
            Assert.AreEqual(110f, button3.OuterTop);
        }
        public void ContainsIsClickedTest()
        {
            var container1 = new DrawingObjectContainer()
            {
                Location = new PointF(10, 100),
                MarginLeft = 100,
                PaddingLeft = 1,
                MarginTop = 1000,
                PaddingTop = 10,
            };

            // 111, 1110
            var container2 = new DrawingObjectContainer()
            {
                Location = new PointF(10, 100),
                MarginLeft = 100,
                PaddingLeft = 1,
                MarginTop = 1000,
                PaddingTop = 10,
            };

            // 222, 2220
            var label = new EigoTestLabelItem()
            {
                MarginLeft = 100,
                MarginTop = 1000,
                PaddingLeft = 1000,
                PaddingTop = 1000,
                Location = new PointF(10, 100),
                Size = new SizeF(50, 500),
            };
            // 332, 3320

            container1.Items.Add(container2);
            container2.Items.Add(label);

            Assert.False(label.Contains(15f, 150f));
            Assert.True(label.Contains(332f, 3320f));
            Assert.True(label.Contains(1332f, 4320f));

            Assert.False(label.IsClicked(15f, 150f));
            Assert.True(label.IsClicked(332f, 3320f));
            Assert.True(label.IsClicked(1332f, 4320f));

            label.IsClickable = false;
            label.IsVisible = false;
            Assert.False(label.IsClicked(332f, 3320f));
            Assert.False(label.IsClicked(1332f, 4320f));

            label.IsClickable = false;
            label.IsVisible = true;
            Assert.False(label.IsClicked(332f, 3320f));
            Assert.False(label.IsClicked(1332f, 4320f));

            label.IsClickable = true;
            label.IsVisible = false;
            Assert.False(label.IsClicked(332f, 3320f));
            Assert.False(label.IsClicked(1332f, 4320f));

            label.IsClickable = true;
            label.IsVisible = true;
            Assert.True(label.IsClicked(332f, 3320f));
            Assert.True(label.IsClicked(1332f, 4320f));
        }
        public void フローティング機能でマージン設定()
        {
            var window = new EPuzzleWindow();
            var windowState = new WindowState(window);
            window.State = windowState;
            var container = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1f, Top = 10f,
                Width = 1000f, Height = 1000f,
            };
            var button0 = new EigoTestButtonItem()
            {
                Floating = DrawingObjectFloating.Left,
                Width = 10f, Height = 100f,
            };
            var button1 = new EigoTestButtonItem()
            {
                MarginLeft = 1f, MarginTop = 10f,
                Width = 10f, Height = 100f,
            };
            window.State.Items.Add(container);
            container.Items.Add(button0);
            container.Items.Add(button1);

            Assert.AreEqual(1f, button0.OuterLeft);
            Assert.AreEqual(10f, button0.OuterTop);
            Assert.AreEqual(12f, button1.BorderLeft);
            Assert.AreEqual(20f, button1.BorderTop);
        }
        public void WidthHeightの自動設定()
        {
            // 初期状態
            var test = new DrawingObjectContainer();
            Assert.AreEqual(0, test.Width);
            Assert.AreEqual(0, test.Height);

            // 親がある状態
            {
                var root = new DrawingObjectContainer()
                {
                    Width = 500,
                    Height = 5000,
                };
                var container = new DrawingObjectContainer()
                {
                    MarginLeft = 1, MarginRight = 2,
                    PaddingLeft = 10, PaddingRight = 20,
                    MarginTop = 100, MarginBottom = 200,
                    PaddingTop = 1000, PaddingBottom = 2000,
                };
                root.Items.Add(container);

                Assert.AreEqual(500 - (1 + 2 + 10 + 20), container.Width);
                Assert.AreEqual(0f, container.Height);

                container.Width = 10;
                container.Height = 100;
                Assert.AreEqual(10, container.Width);
                Assert.AreEqual(100, container.Height);
            }
        }
        public void ParentTest()
        {
            var container1 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                Location = new PointF(10, 100),
                MarginLeft = 100,
                PaddingLeft = 1,
                MarginTop = 1000,
                PaddingTop = 10,
            };
            var container2 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Location = new PointF(10, 100),
                MarginLeft = 100,
                PaddingLeft = 1,
                MarginTop = 1000,
                PaddingTop = 10,
            };
            var label = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,
                MarginLeft = 100,
                MarginTop = 1000,
                Location = new PointF(10, 100),
            };

            container1.Items.Add(container2);
            container2.Items.Add(label);

            Assert.Null(container1.Parent);
            Assert.AreSame(container1, container2.Parent);
            Assert.AreSame(container2, label.Parent);

            Assert.AreEqual(110f, container1.BorderLeft);
            Assert.AreEqual(221f, container2.BorderLeft);
            Assert.AreEqual(332f, label.BorderLeft);

            Assert.AreEqual(1100f, container1.BorderTop);
            Assert.AreEqual(2210f, container2.BorderTop);
            Assert.AreEqual(3320f, label.BorderTop);
        }
        public void OuterBorderInnerTest()
        {
            var container1 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,

                Location = new PointF(10, 100),
                MarginLeft = 100,
                MarginRight = 100,
                PaddingLeft = 1,
                PaddingRight = 1,
                MarginTop = 1000,
                MarginBottom = 1000,
                PaddingTop = 10,
                PaddingBottom = 10,
                Size = new SizeF(50, 500),
            };
            var label = new EigoTestLabelItem()
            {
                Position = DrawingObjectPosition.Absolute,

                MarginLeft = 100,
                MarginTop = 1000,
                PaddingLeft = 100,
                PaddingTop = 1000,
                Location = new PointF(10, 100),
                Size = new SizeF(50, 500),
            };

            container1.Items.Add(label);

            Assert.AreEqual(10, container1.Left);
            Assert.AreEqual(100, container1.Top);
            Assert.AreEqual(10, container1.OuterLeft);
            Assert.AreEqual(10 + 252, container1.OuterRight);
            Assert.AreEqual(100, container1.OuterTop);
            Assert.AreEqual(100 + 2520, container1.OuterBottom);

            Assert.AreEqual(110, container1.BorderLeft);
            Assert.AreEqual(110 + 52, container1.BorderRight);
            Assert.AreEqual(1100, container1.BorderTop);
            Assert.AreEqual(1100 + 520, container1.BorderBottom);

            Assert.AreEqual(111, container1.InnerLeft);
            Assert.AreEqual(111 + 50, container1.InnerRight);
            Assert.AreEqual(1110, container1.InnerTop);
            Assert.AreEqual(1110 + 500, container1.InnerBottom);

            Assert.AreEqual(50, container1.Width);
            Assert.AreEqual(500, container1.Height);
            Assert.AreEqual(52, container1.BorderWidth);
            Assert.AreEqual(520, container1.BorderHeight);
            Assert.AreEqual(252, container1.OuterWidth);
            Assert.AreEqual(2520, container1.OuterHeight);

            // ラベル
            Assert.AreEqual(10, label.Left);
            Assert.AreEqual(100, label.Top);

            // Location = new PointF(10, 100),
            Assert.AreEqual(111 + 10, label.OuterLeft);
            Assert.AreEqual(1110 + 100, label.OuterTop);

            // MarginLeft = 100,
            // MarginTop = 1000,
            Assert.AreEqual(111 + 10 + 100, label.BorderLeft);
            Assert.AreEqual(1110 + 100 + 1000, label.BorderTop);

            // PaddingLeft = 100,
            // PaddingTop = 1000,
            Assert.AreEqual(111 + 10 + 100 + 100, label.InnerLeft);
            Assert.AreEqual(1110 + 100 + 1000 + 1000, label.InnerTop);
        }
        public override void UpdateItemsToBeDrawn()
        {
            var currentItemInfo = SaveCurrentItem();

            Items.Clear();
            CurrentItem = null;

            var userInfo = Window.EPuzzleData.CurrentUserInfo;

            var w = DrawingObjectRoot.Width;
            var h = DrawingObjectRoot.Height;

            var h0 = 60f;
            var h1 = 120f;
            var h2 = 60f;
            var h4 = 60f;

            var h3 = h - ( h0 + h1 + h2 + h4 );
            var w0 = w / 2f;
            var w1 = w0;
            var w3 = 20f;

            var x0 = 0f;
            var x1 = w0;

            var y0 = 0f;
            var y1 = y0 + h0;
            var y2 = y1 + h1;
            var y3 = y2 + h2;
            var y4 = y3 + h3;

            var font0 = EPuzzleFonts.GetMsGothic((int)Math.Round(h0 / 3d));
            var font1 = EPuzzleFonts.GetEnSansSerif(Shomon.Mondaibun, (int)Math.Round(h1 / 2d / 3d));
            var font2 = EPuzzleFonts.GetFont("Arial", (int)Math.Round(h2 / 3d));
            var font3 = EPuzzleFonts.GetMsGothic((int)Math.Round(h4 / 4d));

            var chumonTitle = new EigoTestLabelItem(Shomon.Parent.LongName)
            {
                Position = DrawingObjectPosition.Absolute,
                Left = x0,
                Top = y0,
            //				Width = 400,
                Height = h0,
                Font = font0,
                MarginLeft = w3,
                Name = "title",
                StringFormat = new StringFormat()
                {
                    Alignment = StringAlignment.Center,
                    LineAlignment = StringAlignment.Center,
                },

            //				BorderLine = true,
            };
            Items.Add(chumonTitle);

            var mondaiBun = new EigoTestLabelItem()
            {
                Left = x0,
                Top = y1,
            //				Width = 600,
                Height = h1,
                Font = font1,
            //				MarginLeft = w3,
                StringFormat = new StringFormat()
                {
                    Alignment = StringAlignment.Near,
                    LineAlignment = StringAlignment.Near,
                },

                Position = DrawingObjectPosition.Absolute,
            //				BorderLine = true,
                Name = "mondaibun",
                Color = Color.Black,
                Text = Shomon.Mondaibun,
            //				Font = EPuzzleFonts.問題文,

            /*				MarginLeft = 20,
                MarginRight = 20,
                MarginTop = 20,
                MarginBottom = 0,
                PaddingTop = 10,
                PaddingBottom = 10,*/
                PaddingLeft = 20,
                PaddingRight = 20,

                BorderLine = true,
            };
            Items.Add(mondaiBun);

            var answerBox = new AnswerBox()
            {
                Position = DrawingObjectPosition.Absolute,
                Name = "answerBox",
                Left = x0,
                Top = y2,
            //				Width = h1,
                Height = h2 + h3,
                Font = font2,
            //				MarginLeft = w3,
                StringFormat = new StringFormat()
                {
                    Alignment = StringAlignment.Near,
                    LineAlignment = StringAlignment.Near,
                },
            /*
                PaddingTop = 10,
                PaddingBottom = 10,*/
                PaddingLeft = 20,
                PaddingRight = 20,

                Color = Color.Blue,

                BorderLine = true,
            };
            answerBox.PropertyChanged += (sender, e) =>
            {
                if ("Text" == e.PropertyName)
                {
                    Invalidate();

                    var isCorrect = Shomon.正解判定(answerBox.Text);
                    if (!isCorrect) return;

                    Window.ChumonResult.ShomonResults.Add(new ShomonResult(Shomon, false));
                    // 正解したら次の状態に遷移
                    if (null == Shomon.NextItem)
                    {
                        var mondaiResult = _shomonStateHelper.GetMondaiResult();
                        Window.EPuzzleData.CurrentUserInfo.MondaiResults.Add(mondaiResult);
                        var medal = Window.ChumonResult.GetMedal();
                        if (null != medal)
                        {
                            Window.EPuzzleData.CurrentUserInfo.Medals.Add(medal);
                        }
                        Window.State = WindowState.FoFi(this, new ChumonResultState(Window, Shomon, Window.ChumonResult, mondaiResult));
                    }
                    else
                    {
                        Window.State = WindowState.FoFi(this, Window.CreateMondaiState(Shomon.NextItem));
                    }
                }
            };
            Items.Add(answerBox);

            var buttonContainer = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = x0,
                Top = y4,
                Height = h4,
                Color = EPuzzleColors.Color03,
                BorderLine = true,
            };
            Items.Add(buttonContainer);

            {
                var button = ShomonStateHelper.CreateButton("全消去", "clearAnswer", font3);
                button.Height = h4;
                buttonContainer.Items.Add(button);
            }
            {
                var button = ShomonStateHelper.CreateButton("正解を見る", "showCorrectAnswer", font3);
                button.Height = h4;
                buttonContainer.Items.Add(button);
            }
            {
                var button = ShomonStateHelper.CreateButton(AddShortcutKeys("PAUSE", Command.Action3), "pause", font3);
                button.Height = h4;
                buttonContainer.Items.Add(button);
            }
            if (Shomon.Sounds.Where(x => SoundIsPlayedWhen.UserRequest == x.IsPlayedWhen).Any())
            {
                var button = ShomonStateHelper.CreateButton(AddShortcutKeys("音声の再生", Command.Action4), "playSound", font3);
                button.Height = h4;
                buttonContainer.Items.Add(button);
            }
            if (((Chumon)Shomon.Parent).HelpIds.Any())
            {
                var button = ShomonStateHelper.CreateButton("情報を見る", "info", font3);
                button.Height = h4;
                buttonContainer.Items.Add(button);
            }
            // ここから右寄せ
            {
                var xx = w;
                {
                    var button = ShomonStateHelper.CreateButton("戻る", "back", font3);
                    button.Height = h4;
                    button.Position = DrawingObjectPosition.Absolute;
                    xx = xx - button.OuterWidth;
                    button.Left = xx;
                    buttonContainer.Items.Add(button);
                }
                {
                    var button = ShomonStateHelper.CreateButton("はじめから", "hajimekara", font3);
                    button.Height = h4;
                    button.Position = DrawingObjectPosition.Absolute;
                    xx = xx - button.OuterWidth;
                    button.Left = xx;
                    buttonContainer.Items.Add(button);
                }
            }

            RestoreCurrentItem(currentItemInfo);
        }
        public void 色の継承()
        {
            var container0 = new DrawingObjectContainer();
            var container1 = new DrawingObjectContainer();
            var label = new EigoTestLabelItem();

            container0.Items.Add(container1);
            container1.Items.Add(label);
            Assert.AreEqual(Color.Empty, label.Color);

            container0.Color = Color.Red;
            Assert.AreEqual(Color.Red, label.Color);

            label.Color = Color.Blue;
            Assert.AreEqual(Color.Blue, label.Color);
        }
        public void PreviousItemTest()
        {
            var container = new DrawingObjectContainer()
            {
                Left = 1, Top = 10, Width = 300, Height = 3000,
            };
            Assert.AreEqual(DrawingObjectPosition.Static, container.Position);

            var button0 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };
            var button1 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };
            var button2 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Left = 1, Top = 10, Width = 200, Height = 100,
            };

            Assert.Null(button0.PreviousItem);
            Assert.Null(button1.PreviousItem);
            Assert.Null(button2.PreviousItem);

            container.Items.Add(button0);
            container.Items.Add(button1);
            container.Items.Add(button2);

            Assert.Null(button0.PreviousItem);
            Assert.AreSame(button0, button1.PreviousItem);
            Assert.AreSame(button1, button2.PreviousItem);

            Assert.Throws<ArgumentException>(() =>
            {
                container.Items[1] = button2;
            });

            container.Items.RemoveAt(1);
            Assert.Null(button0.PreviousItem);
            Assert.Null(button1.PreviousItem);
            Assert.AreSame(button0, button2.PreviousItem);

            container.Items.Insert(1, button1);
            Assert.Null(button0.PreviousItem);
            Assert.AreSame(button0, button1.PreviousItem);
            Assert.AreSame(button1, button2.PreviousItem);

            container.Items.RemoveAt(2);
            Assert.Null(button0.PreviousItem);
            Assert.AreSame(button0, button1.PreviousItem);
            Assert.Null(button2.PreviousItem);

            container.Items[0] = button2;
            Assert.Null(button0.PreviousItem);
            Assert.AreSame(button2, button1.PreviousItem);
            Assert.Null(button2.PreviousItem);
        }
        public ChumonResultState(EPuzzleWindow window, EigoTestMondai mondai, ChumonResult chumonResult, MondaiResult mondaiResult)
            : base(window)
        {
            _mondai = mondai;
            _chumonResult = chumonResult;

            DrawingObjectRoot.BackColor = EPuzzleColors.Color109;

            //			var imageFile = ResultImageManager.Instance.GetFile(_mondai.Parent.GetGradeString(mondaiResult.所要時間));
            //			var imageFile = ResultImageManager.Instance.GetImage(_mondai.Parent.GetGradeString(mondaiResult.所要時間));
            var image = window.EPuzzleData.CurrentUserInfo.ResultImageManager.GetImage(_mondai.Parent.GetGradeString(mondaiResult.所要時間, window.EPuzzleData.CurrentUserInfo));
            if (null != image)
            {
            //				var imageItem = new ImageItem(imageFile, true);
                var imageItem = new ImageItem(image.Shrink((int)DrawingObjectRoot.Width, (int)DrawingObjectRoot.Height));
                imageItem.Left = 0f;
                imageItem.Top = 0f;
                imageItem.Position = DrawingObjectPosition.Absolute;
                Items.Add(imageItem);

            #if DEBUG
                { // 使用したファイルの記録
                    var imagePath = (string)image.Tag;
                    Clipboard.SetText(imagePath);

                    var path = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "usedImages.txt");
                    File.AppendAllText(path, imagePath + Environment.NewLine);
                }
            #endif // DEBUG

            //				ResultImageManager.Instance.UpdateAccessTime(fileName);
            //				ResultImageManager.Instance.SaveFileIfItPassed(TimeSpan.FromMinutes(10d));
            }

            var w1 = 180f;
            var h1 = EPuzzleFonts.ChumonResultState_Default.Height;
            var backColor = EPuzzleColors.Color107;

            var kirokuBox = new KirokuBox2()
            {
                BorderLine = false,
                Position = DrawingObjectPosition.Absolute,
                Width = 200,
                UserInfo = Window.EPuzzleData.CurrentUserInfo,
                Chumon = (Chumon)_mondai.Parent,
                Color = EPuzzleColors.ChumonResultState_KirokuBox2_Color,
                BackColor = EPuzzleColors.ChumonResultState_KirokuBox2_BackColor,
                BackColorA = EPuzzleColors.ChumonResultState_KirokuBox2_BackColorA,
                BackColorB = EPuzzleColors.ChumonResultState_KirokuBox2_BackColorB,
                LineColor = EPuzzleColors.ChumonResultState_KirokuBox2_LineColor,
                NodeColor = EPuzzleColors.ChumonResultState_KirokuBox2_NodeColor,
            };
            Items.Add(kirokuBox);

            var box = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                Color = EPuzzleColors.Color108,
                BackColor = backColor,
                Width = w1,
                PaddingLeft = 10f, PaddingRight = 10f,
                PaddingTop = 10f, PaddingBottom = 10f,
                BorderLine = false,
            };
            Items.Add(box);

            {
                var item = new EigoTestLabelItem()
                {
                    Color = EPuzzleColors.Color108,
                    Text = mondai.Parent.LongName,
                    Font = EPuzzleFonts.ChumonResultState_Default,
                    Width = w1,
                    Height = h1,
                    StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                };
                box.Items.Add(item);
            }
            {
                var item = new EigoTestLabelItem()
                {
                    Color = EPuzzleColors.Color108,
                    Text = string.Format("グレード: {0}({1:0.00})", mondai.Parent.GetGradeString(mondaiResult.所要時間, window.EPuzzleData.CurrentUserInfo), mondai.Parent.GetGrade(mondaiResult.所要時間, window.EPuzzleData.CurrentUserInfo)),
                    Font = EPuzzleFonts.ChumonResultState_Default,
                    Width = w1,
                    Height = h1,
                    StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                };
                box.Items.Add(item);
            }
            {
                var duration = mondai.Parent.復習までの猶予期間を取得(window.EPuzzleData.CurrentUserInfo);
                if (null != duration)
                {
                    var item = new EigoTestLabelItem()
                    {
                        Color = EPuzzleColors.Color108,
                        Text = string.Format("復習猶予期間: {0:0.0}日", ((TimeSpan)duration).TotalDays),
                        Font = EPuzzleFonts.ChumonResultState_Default,
                        Width = w1,
                        Height = h1,
                        StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                    };
                    box.Items.Add(item);
                }
            }
            {
                var item = new EigoTestLabelItem()
                {
                    Color = EPuzzleColors.Color108,
                    Text = string.Format("基準時間: {0}", EigoTestMondai.符号無時間文字列(_mondai.Parent.GetTimeLimit(window.EPuzzleData.CurrentUserInfo))),
                    Font = EPuzzleFonts.ChumonResultState_Default,
                    Width = w1,
                    Height = h1,
                    StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                };
                box.Items.Add(item);
            }
            {
                var item = new EigoTestLabelItem()
                {
                    Color = EPuzzleColors.Color108,
                    Text = string.Format("所要時間: {0}", EigoTestMondai.符号無時間文字列(mondaiResult.所要時間)),
                    Font = EPuzzleFonts.ChumonResultState_Default,
                    Width = w1,
                    Height = h1,
                    StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                };
                box.Items.Add(item);
            }
            {
                var item = new EigoTestLabelItem()
                {
                    Color = EPuzzleColors.Color108,
                    Text = string.Format("基準との差: {0}", EigoTestMondai.符号付時間文字列(mondaiResult.所要時間 - _mondai.Parent.GetTimeLimit(window.EPuzzleData.CurrentUserInfo))),
                    Font = EPuzzleFonts.ChumonResultState_Default,
                    Width = w1,
                    Height = h1,
                    StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                };
                box.Items.Add(item);
            }
            /*			{
                var item = new EigoTestLabelItem()
                {
                    Color = EPuzzleColors.Color108,
                    Text = string.Format("Perfect: {0}", string.Join("", chumonResult.ShomonResults.Select(x => x.IsPerfect ? "■" : "□").ToArray())),
                    Font = EPuzzleFonts.ChumonResultState_Default,
                    Width = w1,
                    Height = h1,
                    StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                };
                box.Items.Add(item);
            }*/
            {
                var height = 25f;
                var stars = chumonResult.ShomonResults.Select(x =>
                {
                    var star = new Pentagram(2)
                    {
                        Color = EPuzzleColors.PerfectStarOnChumonResultState,
                        Width = height,
                        Height = height,
                        Tag = x.IsPerfect,
                        PaddingLeft = 3f,
                        PaddingBottom = 3f,
                    };
                    return star;
                }).ToArray();
            /*				for (int i = 0; i < stars.Length; i++)
                {
                    stars[i].Left = stars[0].OuterWidth * i;
                    stars[i].Top = DrawingObjectRoot.Height - stars[0].OuterHeight;
                }
                */
                for (int i = 0; i < stars.Length; i++)
                {
                    stars[i].Left = stars[0].OuterWidth * i;
                    stars[i].Top = 0f;
                }

                if (stars.Any())
                {
                    var starbox = new DrawingObjectContainer()
                    {
                        Position = DrawingObjectPosition.Absolute,
                        Left = 0f,
                        Top = DrawingObjectRoot.Height - stars.First().OuterHeight,
                        Width = stars.Last().OuterRight - stars.First().OuterLeft,
                        Height = stars.First().OuterHeight,
            //						BackColor = EPuzzleColors.Color107,
                    };
                    starbox.Items.AddRange(stars);
                    Items.Add(starbox);
                }
            //				Items.AddRange(stars);
            }

            /*			{
                var bestMondaiResult = window.EPuzzleData.CurrentUserInfo.MondaiResults.GetBest(mondai.Parent.Id);
                if (null != bestMondaiResult)
                {
                    var item = new EigoTestLabelItem()
                    {
                        Color = EPuzzleColors.Color108,
                        Text = string.Format("最速記録: {0}", EigoTestMondai.符号無時間文字列(bestMondaiResult.所要時間)),
                        Font = EPuzzleFonts.ChumonResultState_Default,
                        Width = w1,
                        Height = h1,
                        StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                    };
                    box.Items.Add(item);
                }
            }
            {
                var bestMondaiResult = window.EPuzzleData.CurrentUserInfo.MondaiResults.GetBest(mondai.Parent.Id);
                if (null != bestMondaiResult)
                {
                    var item = new EigoTestLabelItem()
                    {
                        Color = EPuzzleColors.Color108,
                        Text = string.Format("最速との差: {0}", EigoTestMondai.符号付時間文字列(mondaiResult.所要時間 - bestMondaiResult.所要時間)),
                        Font = EPuzzleFonts.ChumonResultState_Default,
                        Width = w1,
                        Height = h1,
                        StringFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, },
                    };
                    box.Items.Add(item);
                }
            }*/

            /*			var retryButton = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                Color = EPuzzleColors.Color108,
                Text = "再挑戦",
                Name = "retryButton",
                Font = EPuzzleFonts.ChumonResultState_Default,
                Width = 80,
                Height = h1,
            };
            Items.Add(retryButton);*/

            /*
            // 右がbox
            box.Left = DrawingObjectRoot.Width - ( box.OuterWidth + kirokuBox.OuterWidth );
            box.Top = DrawingObjectRoot.Height - box.OuterHeight;

            kirokuBox.Height = box.OuterHeight;
            kirokuBox.Left = DrawingObjectRoot.Width - kirokuBox.OuterWidth;
            kirokuBox.Top = box.Top;
            */

            box.Left = DrawingObjectRoot.Width - box.OuterWidth;
            box.Top = DrawingObjectRoot.Height - box.OuterHeight;

            kirokuBox.Height = box.OuterHeight;
            kirokuBox.Left = box.OuterLeft - kirokuBox.OuterWidth;
            kirokuBox.Top = box.Top;

            Action0 += (sender, e) =>
            {
                MouseUpInternal(new MouseEventInfo(new PointF(0f, 0f), MouseButtons.Left));
            };
        }
        public void RemoveTest()
        {
            var label = new EigoTestLabelItem();
            var container = new DrawingObjectContainer();

            container.Items.Add(label);
            Assert.AreEqual(1, container.Items.Count());
            Assert.AreSame(container, label.Parent);

            container.Items.Remove(label);
            Assert.AreEqual(0, container.Items.Count());
            Assert.Null(label.Parent);
        }
        public void CopyTest()
        {
            var container1 = new DrawingObjectContainer()
            {
                Location = new PointF(10, 100),
                MarginLeft = 100,
                MarginRight = 100,
                PaddingLeft = 1,
                PaddingRight = 1,
                MarginTop = 1000,
                MarginBottom = 1000,
                PaddingTop = 10,
                PaddingBottom = 10,
                Size = new SizeF(50, 500),
            };
            var label = new EigoTestLabelItem()
            {
                MarginLeft = 100,
                MarginTop = 1000,
                PaddingLeft = 100,
                PaddingTop = 1000,
                Location = new PointF(10, 100),
                Size = new SizeF(50, 500),
            };
            container1.Items.Add(label);

            Assert.AreSame(container1, label.Parent);

            var label2 = label.Copy();
            Assert.AreEqual(label.MarginLeft, label2.MarginLeft);
            Assert.AreEqual(label.MarginTop, label2.MarginTop);
            Assert.AreEqual(label.PaddingLeft, label2.PaddingLeft);
            Assert.AreEqual(label.PaddingTop, label2.PaddingTop);
            Assert.AreEqual(label.Location, label2.Location);
            Assert.AreEqual(label.Size, label2.Size);
            Assert.AreNotEqual(label.Id, label2.Id);
            Assert.Null(label2.Parent);
        }
        public void マージンのデフォルト設定()
        {
            var container0 = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Relative,
                Left = 0, Top = 0, Width = 300, Height = 3000,
            };
            var container1 = new DrawingObjectContainer()
            {
            };
            var button0 = new EigoTestButtonItem()
            {
                MarginTop = 1,
                Width = 200, Height = 100,
            };
            var button1 = new EigoTestButtonItem()
            {
                MarginTop = 10,
                Width = 200, Height = 100,
                MarginBottom = 1,
            };

            container0.Items.Add(container1);
            container1.Items.Add(button0);
            container1.Items.Add(button1);

            Assert.AreEqual(0, container1.MarginTop);
            Assert.AreEqual(0, container1.MarginBottom);
            Assert.AreEqual(210, container1.Height);

            // Absolute要素は除外
            var button2 = new EigoTestButtonItem()
            {
                Position = DrawingObjectPosition.Absolute,
                MarginTop = 10,
                Width = 200, Height = 100,
                MarginBottom = 1,
            };
            container1.Items.Add(button2);
            Assert.AreEqual(210, container1.Height);
        }
        public void 最上位アイテムはDrawingObjectContainer()
        {
            var testState = new Fish.eigotest.TestState(null);
            var drawingObjectContainer1 = new DrawingObjectContainer();

            testState.Items.Add(drawingObjectContainer1);

            Assert.NotNull(drawingObjectContainer1.Parent);
            Assert.IsInstanceOf<DrawingObjectContainer>(drawingObjectContainer1.Parent);

            // デフォルトの幅と高さ
            Assert.AreEqual(1024, drawingObjectContainer1.Width);
            Assert.AreEqual(0f, drawingObjectContainer1.Height);
        }
        public void MouseClickイベントの送出()
        {
            var window = new EPuzzleWindow();
            var testState = new Fish.eigotest.TestState(window);
            var container = new DrawingObjectContainer()
            {
                MarginLeft = 10f,
                MarginTop = 100f,
            };
            var label = new EigoTestLabelItem()
            {
                Size = new SizeF(10, 100),
            };
            testState.Items.Add(container);
            container.Items.Add(label);
            window.State = testState;

            label.Click += (sender, e) =>
            {
                Assert.Pass();
            };

            Assert.AreEqual(1014f, container.Width);

            Assert.AreEqual(DrawingObjectPosition.Static, container.Position);
            Assert.AreEqual(10f, label.OuterLeft);
            Assert.AreEqual(100f, label.OuterTop);
            Assert.AreEqual(10f, label.Width);
            Assert.AreEqual(100f, label.Height);
            window.MouseUp(15f, 150f, MouseButtons.Left);
            Assert.Fail();
        }
        public void GetParentsTest()
        {
            var container1 = new DrawingObjectContainer();
            var container2 = new DrawingObjectContainer();
            var label = new EigoTestLabelItem();

            container1.Items.Add(container2);
            container2.Items.Add(label);

            CollectionAssert.AreEqual(new EigoTestDrawingObject[] { container2, container1, }, label.GetParents().ToArray());
        }
        public HelpItemState(EPuzzleWindow window, HelpItemBase[] helpItems, int helpItemIndex, WindowState parentState)
            : base(window)
        {
            _helpItems = helpItems;
            _helpItemIndex = helpItemIndex;
            _parentState = parentState;

            var helpItemButtons = helpItems.Select(helpItem =>
            {
                var helpItemButton = new EigoTestButtonItem("", 20f, 18f)
                {
                    Position = DrawingObjectPosition.Absolute,
                    MarginRight = 10f,
                    MarginBottom = 10f,
                    Tag = helpItem,
                };
                return helpItemButton;
            });
            var helpItemButtonContainer = new DrawingObjectContainer()
            {
                Position = DrawingObjectPosition.Absolute,
                MarginLeft = 50f,
                Height = 40f,
            };
            helpItemButtonContainer.Items.AddRange(helpItemButtons);
            helpItemButtonContainer.Items[helpItemIndex].IsClickable = false;
            Items.Add(helpItemButtonContainer);

            for (int i = 1; i < helpItemButtonContainer.Items.Count(); i++)
            {
                var s = helpItemButtonContainer.Items[i - 1];
                var t = helpItemButtonContainer.Items[i];
                t.Left = s.Left + s.OuterWidth;
            }
            helpItemButtonContainer.下揃え();

            var modoruButton = new EigoTestButtonItem("続ける", 80f, 50f)
            {
                Position = DrawingObjectPosition.Absolute,
                Name = "tsudukeru",
                MarginRight = 50f, MarginBottom = 10f,
            };
            Items.Add(modoruButton);
            modoruButton.右揃え();
            modoruButton.下揃え();

            if (0 < helpItemIndex)
            {
                var previousButton = new PreviousButton()
                {
                    Position = DrawingObjectPosition.Absolute,
                    MarginLeft = 10f,
                    Tag = helpItemIndex - 1,
                };
                Items.Add(previousButton);
                previousButton.垂直方向に中央揃え();
            }
            if (helpItemIndex < helpItemButtonContainer.Items.Count() - 1)
            {
                var nextButton = new NextButton()
                {
                    Position = DrawingObjectPosition.Absolute,
                    MarginRight = 10f,
                    Tag = helpItemIndex + 1,
                };
                Items.Add(nextButton);
                nextButton.垂直方向に中央揃え();
                nextButton.右揃え();
            }
            if (!string.IsNullOrWhiteSpace(_helpItems[helpItemIndex].ImageFile))
            {
                var imageFile = Path.Combine(window.EPuzzleData.HelpDirectory, _helpItems[helpItemIndex].ImageFile);
                var imageItem = new ImageItem(imageFile)
                {
                    Position = DrawingObjectPosition.Absolute,
                    MarginTop = 20f,
                };
                Items.Add(imageItem);
                imageItem.水平方向に中央揃え();
            }

            Action0 += (sender, e) =>
            {
                if (CurrentItem is NextButton)
                {
                    MoveTo((int)CurrentItem.Tag);
                }
                else if (CurrentItem is PreviousButton)
                {
                    MoveTo((int)CurrentItem.Tag);
                }
                else if (CurrentItem.Tag is HelpItem)
                {
                    var index = Array.IndexOf(helpItems, CurrentItem.Tag);
                    MoveTo(index);
                }
                else if ("tsudukeru" == CurrentItem.Name)
                {
                    Window.State = parentState;
                }
            };
            Action3 += (sender, e) =>
            {
                Window.State = parentState;
            };
        }
        public PauseState(EPuzzleWindow window, WindowState previousState)
            : base(window)
        {
            if (null == previousState) throw new ArgumentNullException();
            PreviousState = previousState;

            var gameButton = new EigoTestButtonItem()
            {
                Text = "ゲームに戻る",
            };
            gameButton.Click += (sender, e) =>
            {
                ゲームに戻る();
            };

            var menuButton = new EigoTestButtonItem()
            {
                Text = "メニューに戻る",
            };
            menuButton.Click += (sender, e) =>
            {
                BackToChumonMenu();
            };
            var titleButton = new EigoTestButtonItem()
            {
                Text = "タイトルに戻る",
            };
            titleButton.Click += (sender, e) =>
            {
                MoveToStartGameState();
            };

            var desktopButton = new EigoTestButtonItem()
            {
                Text = "ディスクトップに戻る",
             			};
             			desktopButton.Click += (sender, e) =>
             			{
             				Window.QuitGame(this);
             			};

            float y = 0f;
             			foreach (var button in new [] { gameButton, menuButton, titleButton, desktopButton })
             			{
             				button.Top = y;
             				button.Height = 50f;
                button.MarginBottom = 20f;
            //				button.PaddingTop = button.PaddingBottom = 10f;

                button.Color = Color.White;
                button.BackColor = Color.FromArgb(255, 80, 80, 80);
                button.BorderLine = true;
                button.Font = EPuzzleFonts.PauseStateButton;

                y += button.OuterHeight;
             			}

            var container = new DrawingObjectContainer()
            {
                MarginLeft = 300,
                MarginRight = 300,
            };
            container.MarginTop = (DrawingObjectRoot.Height - y) / 2;

            container.Items.Add(gameButton);
            container.Items.Add(menuButton);
            container.Items.Add(titleButton);
            container.Items.Add(desktopButton);
            Items.Add(container);

            Action1 += (sender, e) =>
            {
                ゲームに戻る();
            };
            Action3 += (sender, e) =>
            {
                ゲームに戻る();
            };
        }