From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。

---
 HotelPms.Share.Windows/Component/Design/DesignPanel.cs |  610 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 610 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Share.Windows/Component/Design/DesignPanel.cs b/HotelPms.Share.Windows/Component/Design/DesignPanel.cs
new file mode 100644
index 0000000..2969f3a
--- /dev/null
+++ b/HotelPms.Share.Windows/Component/Design/DesignPanel.cs
@@ -0,0 +1,610 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HotelPms.Share.Windows.Component.Design
+{
+    /// <summary>
+    /// 設計Frame:2015/05/13
+    /// </summary>
+    public class  DesignPanel : Panel
+    {							
+        #region  ★★★★★ Declartions ★★★★★
+
+        public enum ItemType : int
+        {
+            Normal = 0,
+            Line,
+        }
+
+        public enum HitDownSquare : int
+        {
+            None = 0,
+            TopLeft,
+            TopCenter,
+            TopRight,
+            MiddleLeft,
+            MiddleRight,
+            BottomLeft,
+            BottomCenter,
+            BottomRight,
+            Body,
+        }
+
+        public sealed class HitTestInfo
+        {
+            public static readonly HitTestInfo Nowhere;
+
+            internal int y;
+            internal int x;
+            internal HitDownSquare type;
+            internal int index;
+            internal int itemY;
+            internal int itemX;
+
+            static HitTestInfo()
+            {
+                HitTestInfo.Nowhere = new HitTestInfo();
+            }
+
+            internal HitTestInfo()
+            {
+                this.type = HitDownSquare.None;
+                this.x = -1;
+                this.y = -1;
+                this.index = -1;
+            }
+
+            public int X
+            {
+                get { return this.x; }
+            }
+
+            public int Y
+            {
+                get { return this.y; }
+            }
+
+            public int ItemY
+            {
+                get { return this.itemY; }
+            }
+
+            public int ItemX
+            {
+                get { return this.itemX; }
+            }
+
+
+            public int Index
+            {
+                get { return this.index; }
+            }
+
+            public HitDownSquare Type
+            {
+                get { return this.type; }
+            }
+
+            public override int GetHashCode()
+            {
+                return this.x << 16 | this.y << 8 | (int)this.type;
+            }
+
+            public override bool Equals(object obj)
+            {
+                HitTestInfo hi = obj as HitTestInfo;
+                return (this.type == hi.type && this.x == hi.x && this.x == hi.x);
+            }
+
+            public override string ToString()
+            {
+                return string.Concat(new string[7] { "{ ", this.type.ToString(), ",", this.x.ToString(), ",", this.y.ToString(), "}" });
+            }
+        }
+
+        private bool isMouseDown = false;
+
+        private HitTestInfo curHitTestInfo = null;
+        //public bool isSelected = false;
+        private int m_SelectIndex = -1;
+        public bool m_MouseFocused = false;
+        public event EventHandler StyleChange;
+        private float m_Zoom = 1;
+
+        #endregion
+
+        #region  ★★★★★ Property ★★★★★
+
+        private DesignItemCollection m_Items = null;
+
+
+        [Category("Item Setting")]
+        [DefaultValue(null)]
+        [Description("Item")]
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
+        public DesignItemCollection Items
+        {
+            get { return m_Items; }
+            set { m_Items = value; }
+        }
+
+        [Category("Item Setting")]
+        [DefaultValue(1F)]
+        [Description("Zoom")]
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public float Zoom
+        {
+            get { return m_Zoom; }
+            set { m_Zoom = value <= 0 ? 1 : value; Invalidate(); }
+        }
+
+        [Category("Item Setting")]
+        [DefaultValue(-1)]
+        [Description("SelectIndex")]
+        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+        public int SelectIndex
+        {
+            get { return m_SelectIndex; }
+            set { m_SelectIndex = value; Invalidate(); }
+        }
+
+        public DesignItem CurrentItem
+        {
+            get
+            {
+                if(m_SelectIndex == -1) { return null; }
+                return Items[m_SelectIndex];
+            }
+        }
+
+        #endregion
+
+        #region  ★★★★★ Class Event ★★★★★
+
+        public DesignPanel()
+        {
+            //SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
+            this.SetStyle(ControlStyles.DoubleBuffer, true);
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            this.SetStyle(ControlStyles.UserPaint, true);
+            this.SetStyle(ControlStyles.ResizeRedraw, true);
+            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
+            //SetStyle(ControlStyles.SupportsTransparentBackColor, true);
+            //SetStyle(ControlStyles.Opaque, true);  //透明
+            //this.BackColor = Color.Transparent;
+
+            m_Items = new DesignItemCollection(this);
+        }
+
+        #endregion
+
+        #region  ★★★★★ Control Event ★★★★★
+
+        protected override void OnEnter(EventArgs e)
+        {
+            base.OnEnter(e);
+            //isSelected = true;
+            Invalidate();
+        }
+
+        protected override void OnLeave(EventArgs e)
+        {
+            base.OnLeave(e);
+            //isSelected = false;
+            Invalidate();
+        }
+
+        protected override void OnMouseEnter(EventArgs e)
+        {
+            base.OnMouseEnter(e);
+            m_MouseFocused = true;
+            Invalidate();
+        }
+
+        protected override void OnMouseLeave(EventArgs e)
+        {
+            base.OnMouseLeave(e);
+            m_MouseFocused = false;
+            Invalidate();
+        }
+
+        protected override void OnMouseDown(MouseEventArgs e)
+        {
+            this.Focus();
+            //e.X, e.Yとは実際画面の位置ではなく、ヒットされる該当コントロールに対する相対位置
+            isMouseDown = true;  
+            curHitTestInfo = HitTest(e.X, e.Y);
+            SetCursor(curHitTestInfo);
+            m_SelectIndex = curHitTestInfo.index; 
+            Invalidate();
+            System.Diagnostics.Debug.WriteLine(string.Format("OnMouseDown X:{0} Y:{1}", e.X, e.Y));
+            base.OnMouseDown(e);
+        }
+
+        protected override void OnMouseUp(MouseEventArgs e)
+        {
+            this.Cursor = Cursors.Default;
+            isMouseDown = false;
+            System.Diagnostics.Debug.WriteLine(string.Format("OnMouseUp X:{0} Y:{1}", e.X, e.Y));
+            base.OnMouseUp(e);
+        }
+
+        protected override void OnMouseMove(MouseEventArgs e)
+        {
+            if (!isMouseDown)
+            {
+                System.Diagnostics.Debug.WriteLine(string.Format("OnMouseMove X:{0} Y:{1}", e.X, e.Y));
+                HitTestInfo hit = HitTest(e.X, e.Y);
+                SetCursor(hit);
+            }
+            else
+            {
+                int offsetX = 0;
+                int offsetY = 0;
+                System.Diagnostics.Debug.WriteLine(string.Format("X:{0} Y:{1}", e.X, e.Y));
+                if (m_SelectIndex >= 0)
+                {
+                    int x = (int)(e.X / m_Zoom);
+                    int y = (int)(e.Y / m_Zoom);
+                    DesignItem item = Items[m_SelectIndex];
+                    switch (curHitTestInfo.Type)
+                    {
+
+                        case HitDownSquare.TopCenter:
+                            offsetY = item.ClientRectangle.Y + item.ClientRectangle.Height - DesignItem.Square.Height * 3;
+                            if (y < offsetY)
+                            {
+                                item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.Location.X, y), new Size(item.ClientRectangle.Width, item.ClientRectangle.Y + item.ClientRectangle.Height - y));
+                            }
+                            break;
+
+                        case HitDownSquare.TopRight:
+                            offsetX = item.ClientRectangle.X + DesignItem.Square.Width * 3;
+                            offsetY = item.ClientRectangle.Y + item.ClientRectangle.Height - DesignItem.Square.Height * 3;
+                            if (x > offsetX) 
+                            { 
+                                item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.X, item.ClientRectangle.Location.Y), new Size(x - item.ClientRectangle.X, item.ClientRectangle.Height));
+                            }
+                            if (y < offsetY)
+                            {
+                                item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.Location.X, y), new Size(item.ClientRectangle.Width, item.ClientRectangle.Y + item.ClientRectangle.Height - y));
+                            }
+                            break;
+
+                        case HitDownSquare.TopLeft:
+                            offsetX = item.ClientRectangle.X + item.ClientRectangle.Width - DesignItem.Square.Width * 3;
+                            offsetY = item.ClientRectangle.Y + item.ClientRectangle.Height - DesignItem.Square.Height * 3;
+                            if (x < offsetX)
+                            {
+                                item.ClientRectangle = new Rectangle(new Point(x, item.ClientRectangle.Y), new Size(item.ClientRectangle.X + item.ClientRectangle.Width - x, item.ClientRectangle.Height));
+                            }
+                            if (y < offsetY)
+                            {
+                                item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.X, y), new Size(item.ClientRectangle.Width, item.ClientRectangle.Y + item.ClientRectangle.Height - y));
+                            }
+                            break;
+
+                        case HitDownSquare.MiddleLeft:
+                            offsetX = item.ClientRectangle.X + item.ClientRectangle.Width - DesignItem.Square.Width * 3;
+                            if (x < offsetX)
+                            {
+                                item.ClientRectangle = new Rectangle(new Point(x, item.ClientRectangle.Y), new Size(item.ClientRectangle.X + item.ClientRectangle.Width - x, item.ClientRectangle.Height));
+                            }
+                            break;
+
+                        case HitDownSquare.BottomCenter:
+                            offsetY = item.ClientRectangle.Y + DesignItem.Square.Height * 3;
+                            if (y > offsetY) { item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(item.ClientRectangle.Width, y - item.ClientRectangle.Y)); }
+                            break;
+
+                        case HitDownSquare.BottomLeft:
+                            offsetX = item.ClientRectangle.X + item.ClientRectangle.Width - DesignItem.Square.Width * 3;
+                            offsetY = item.ClientRectangle.Y + DesignItem.Square.Height * 3;
+                            if (x < offsetX)
+                            {
+                                item.ClientRectangle = new Rectangle(new Point(x, item.ClientRectangle.Y), new Size(item.ClientRectangle.X + item.ClientRectangle.Width - x, item.ClientRectangle.Height));
+                            }
+                            if (y > offsetY) { item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(item.ClientRectangle.Width, y - item.ClientRectangle.Y)); }
+                            break;
+
+                        case HitDownSquare.BottomRight:
+                            offsetX = item.ClientRectangle.X + DesignItem.Square.Width * 3;
+                            offsetY = item.ClientRectangle.Y + DesignItem.Square.Height * 3;
+                            if (x > offsetX)
+                            {
+                                item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(x - item.ClientRectangle.X, item.ClientRectangle.Height));
+                            }
+                            if (y > offsetY) { item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(item.ClientRectangle.Width, y - item.ClientRectangle.Y)); }
+                            break;
+
+                        case HitDownSquare.MiddleRight:
+                            offsetX = item.ClientRectangle.X + DesignItem.Square.Width * 3;
+                            if (x > offsetX)
+                            {
+                                item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.X, item.ClientRectangle.Location.Y), new Size(x - item.ClientRectangle.X, item.ClientRectangle.Height));
+                            }
+                            break;
+                        case HitDownSquare.Body:
+                            offsetX = x - (int)(curHitTestInfo.X / m_Zoom);
+                            offsetY = y - (int)(curHitTestInfo.Y / m_Zoom);
+                            item.ClientRectangle = new Rectangle(new Point(curHitTestInfo.ItemX + offsetX, curHitTestInfo.ItemY + offsetY), item.ClientRectangle.Size);
+                            break;
+                    }
+                }
+                //RefreshBackground();
+                Invalidate();
+                if (StyleChange != null) { StyleChange(this, new EventArgs()); }
+            }
+            base.OnMouseMove(e);
+        }
+
+        protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
+        {
+            DesignItem item = null;
+            switch (e.KeyCode)
+            {
+                case Keys.Up:
+                    if (m_SelectIndex >= 0)
+                    {
+                        item = Items[m_SelectIndex];
+                        if (e.Shift) 
+                        {
+                            if (item.ClientRectangle.Size.Height > DesignItem.Square.Height * 3)
+                            {
+                                item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(item.ClientRectangle.Size.Width, item.ClientRectangle.Size.Height - 1));
+                            } 
+                        }
+                        else 
+                        { 
+                            item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.X, item.ClientRectangle.Y - 1), item.ClientRectangle.Size); 
+                        }
+                        if (StyleChange != null) { StyleChange(this, new EventArgs()); }
+                    }
+                    break;
+                case Keys.Down:
+                    if (m_SelectIndex >= 0)
+                    {
+                        item = Items[m_SelectIndex];
+                        if (e.Shift)
+                        {
+                            item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(item.ClientRectangle.Size.Width, item.ClientRectangle.Size.Height + 1));
+                        }
+                        else
+                        {
+                            item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.X, item.ClientRectangle.Y + 1), item.ClientRectangle.Size);
+                        }
+
+                        
+                        if (StyleChange != null) { StyleChange(this, new EventArgs()); }
+                    }
+                    break;
+                case Keys.Left:
+                    if (m_SelectIndex >= 0)
+                    {
+                        item = Items[m_SelectIndex];
+                        if (e.Shift)
+                        {
+                            if (item.ClientRectangle.Size.Width > DesignItem.Square.Width * 3)
+                            {
+                                item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(item.ClientRectangle.Size.Width - 1, item.ClientRectangle.Size.Height));
+                            }
+                        }
+                        else
+                        {
+                            item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.X - 1, item.ClientRectangle.Y), item.ClientRectangle.Size);
+                        }
+                        if (StyleChange != null) { StyleChange(this, new EventArgs()); }
+                    }
+                    break;
+                case Keys.Right:
+                    if (m_SelectIndex >= 0)
+                    {
+                        item = Items[m_SelectIndex];
+                        if (e.Shift)
+                        {
+                            item.ClientRectangle = new Rectangle(item.ClientRectangle.Location, new Size(item.ClientRectangle.Size.Width + 1, item.ClientRectangle.Size.Height));
+                        }
+                        else
+                        {
+                            item.ClientRectangle = new Rectangle(new Point(item.ClientRectangle.X + 1, item.ClientRectangle.Y), item.ClientRectangle.Size);
+                        }
+                        if (StyleChange != null) { StyleChange(this, new EventArgs()); }
+                    }
+                    break;
+                default:
+                    base.OnPreviewKeyDown(e);
+                    return;
+            }
+            e.IsInputKey = true;
+            //RefreshBackground();
+            Invalidate();  
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {           
+            base.OnPaint(e);//コントロールのプロパティで設定した部分の描画
+
+            GraphicsState state = e.Graphics.Save();
+            e.Graphics.ScaleTransform((float)m_Zoom, (float)m_Zoom);
+
+            //選択枠
+            int i = 0;
+            foreach (DesignItem item in m_Items) 
+            {
+                System.Diagnostics.Debug.WriteLine(m_SelectIndex.ToString());
+                item.DesignMode = (i == m_SelectIndex);
+                item.Draw(e.Graphics);
+                i++;
+            }
+
+            e.Graphics.Restore(state);
+        }
+
+        #endregion
+
+        #region  ★★★★★ Private Function ★★★★★
+
+
+        private void SetCursor(HitTestInfo hit)
+        {
+            switch (hit.type)
+            {
+                case HitDownSquare.BottomRight:
+                case HitDownSquare.TopLeft:
+                    this.Cursor = Cursors.SizeNWSE;
+                    break;
+                case HitDownSquare.BottomCenter:
+                case HitDownSquare.TopCenter:
+                    this.Cursor = Cursors.SizeNS;
+                    break;
+                case HitDownSquare.BottomLeft:
+                case HitDownSquare.TopRight:
+                    this.Cursor = Cursors.SizeNESW;
+                    break;
+                case HitDownSquare.MiddleLeft:
+                case HitDownSquare.MiddleRight:
+                    this.Cursor = Cursors.SizeWE;
+                    break;
+                case HitDownSquare.Body:
+                    this.Cursor = Cursors.SizeAll;
+                    break;
+                default:
+                    this.Cursor = Cursors.Default;
+                    break;
+            }
+        }
+
+        #endregion
+
+        #region  ★★★★★ Public  Function ★★★★★
+
+        private bool InRectangle(Rectangle r, int x, int y)
+        {
+            return (r.X * m_Zoom <= x && x <= (r.X + r.Width) * m_Zoom) && (r.Y * m_Zoom <= y && y <= (r.Y + r.Height) * m_Zoom);
+        }
+
+        public HitTestInfo HitTest(int x, int y)
+        {
+            HitTestInfo hit = new HitTestInfo();
+            hit.x = x;
+            hit.y = y;
+
+            for (int idx = Items.Count - 1; idx >= 0; idx--)
+            {
+                DesignItem item = Items[idx];
+                for (int i = 0; i < item.SmallRect.Length; i++)
+                {
+                    //if (item.SmallRect[i].Contains(x, y))
+                    if (InRectangle(item.SmallRect[i], x, y))
+                    {
+                        hit.type = (HitDownSquare)(i + 1);
+                        hit.index = idx;
+                        return hit;
+                    }
+                }
+
+                for (int i = 0; i < item.BoundRect.Length; i++)
+                {
+                    //if (item.BoundRect[i].Contains(x, y))
+                    if (InRectangle(item.BoundRect[i], x, y))
+                    {
+                        switch (i)
+                        {
+                            case 0:
+                                hit.type = HitDownSquare.TopCenter;
+                                break;
+                            case 1:
+                                hit.type = HitDownSquare.MiddleLeft;
+                                break;
+                            case 2:
+                                hit.type = HitDownSquare.BottomCenter;
+                                break;
+                            case 3:
+                                hit.type = HitDownSquare.MiddleRight;
+                                break;
+                        }
+                        if (item.Appearance == ItemType.Line)
+                        {
+                            hit.type = HitDownSquare.Body;
+                            hit.itemX = item.ClientRectangle.X;
+                            hit.itemY = item.ClientRectangle.Y;
+                        }
+                        hit.index = idx;
+                        return hit;
+                    }
+                }
+
+                Rectangle bodyR = item.ClientRectangle;
+                if (item.Appearance == ItemType.Line)
+                {
+                    if (item.X1 == item.X2) { bodyR = new Rectangle(bodyR.Location, new Size((int)item.LineWidth < DesignItem.Square.Width ? DesignItem.Square.Width : (int)item.LineWidth, item.ClientRectangle.Height)); }
+                    else if (item.Y1 == item.Y2) { bodyR = new Rectangle(bodyR.Location, new Size(item.ClientRectangle.Width, (int)item.LineWidth < DesignItem.Square.Height ? DesignItem.Square.Height : (int)item.LineWidth)); }
+                }
+
+                //if (bodyR.Contains(x, y))
+                if (InRectangle(bodyR, x, y))
+                {
+                    hit.type = HitDownSquare.Body;
+                    hit.index = idx;
+                    hit.itemX = item.ClientRectangle.X;
+                    hit.itemY = item.ClientRectangle.Y;
+                    return hit;
+                }                
+            }
+
+            return HitTestInfo.Nowhere;
+        }
+
+        public void RemoveItem()
+        {
+            if (m_SelectIndex == -1) { return; }
+            this.Items.RemoveAt(m_SelectIndex);
+            if (this.Items.Count == 0) { m_SelectIndex = -1; }
+            else if (m_SelectIndex >= this.Items.Count) { m_SelectIndex = this.Items.Count - 1; }
+            Invalidate();
+        }
+
+        public DesignItem SelectItem(string name)
+        {
+            for (int i = 0; i < Items.Count; i++)
+            {
+                if(Items[i].Name == name)
+                {
+                    m_SelectIndex = i;
+                    Invalidate();
+                    return CurrentItem;
+                }
+            }
+
+            return null;
+        }
+
+        public void BringItemToFront()
+        {
+            if (m_SelectIndex == -1 || Items.Count == 1) { return; }
+            DesignItem item = CurrentItem;
+            Items.Remove(item);
+            Items.Add(item);
+            m_SelectIndex = Items.Count - 1;
+            Invalidate();
+        }
+
+        public void SendItemToBack()
+        {
+            if (m_SelectIndex == -1 || Items.Count == 1) { return; }
+            DesignItem item = CurrentItem;
+            Items.Remove(item);
+            Items.Insert(item, 0);
+            m_SelectIndex = 0;
+            Invalidate();
+        }
+
+        #endregion
+    }
+}

--
Gitblit v1.10.0