688 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			688 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace CMSControl
 | |
| {
 | |
|     public enum eSystemStep : byte
 | |
|     {
 | |
|         IDLE = 0,
 | |
|         INPUT,
 | |
|         OUTPUT,
 | |
|         REINPUT,
 | |
|         FINISH,
 | |
|         RESULT,
 | |
|         CLOSING = 90,
 | |
|         CLOSEWAIT,
 | |
|         CLOSED,
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public partial class cmsview : Control
 | |
|     {
 | |
| 
 | |
|         public eSystemStep step = eSystemStep.IDLE;
 | |
|         public UInt16 _page;
 | |
|         private Point _gridcount;
 | |
|         public UInt16 GridItemCount { get { return (UInt16)(_gridcount.X * _gridcount.Y); } }
 | |
|         public Boolean isDebug { get; set; }
 | |
|         public int LastContactSlotIDX = -1;
 | |
| 
 | |
|         //private Font _fontid;
 | |
|         //private Font _fontno;
 | |
|         //private Font _fontcontent;
 | |
| 
 | |
|         public float NoStrSize = 100f;
 | |
| 
 | |
|         public Boolean bRePaint;
 | |
|         public List<Slot> Slots = new List<Slot>();
 | |
|         public List<Item> Items = new List<Item>();
 | |
|         public UInt16 ItemMargin { get; set; }
 | |
| 
 | |
|         public Point GridCount { get { return _gridcount; } set { _gridcount = value; } }
 | |
| 
 | |
|         public Font Font_No;    //slotno
 | |
|         public Font Font_Top;   //top
 | |
|         public Font Font_Bottom;   //bottom
 | |
|         public Font Font_Middle;   //bottom
 | |
|         public Font Font_Count;   //bottom
 | |
| 
 | |
|         public System.Drawing.Color color_font_no = Color.White;
 | |
|         public System.Drawing.Color color_font_top = Color.White;
 | |
|         public System.Drawing.Color color_font_middle = Color.White;
 | |
|         public System.Drawing.Color color_font_bottom_left = Color.White;
 | |
|         public System.Drawing.Color color_font_bottom_right = Color.White;
 | |
| 
 | |
|         public Padding Padding_No;
 | |
|         public Padding Padding_Top;
 | |
|         public Padding Padding_Bottom;
 | |
|         public Padding Padding_Middle;
 | |
|         public Padding Padding_Count;
 | |
| 
 | |
|         public string DisplayT;
 | |
|         public string DisplayM;
 | |
|         public string DisplayBL;
 | |
|         public string DisplayBR;
 | |
| 
 | |
|         public System.Windows.Forms.HorizontalAlignment TextAlignT = HorizontalAlignment.Left;
 | |
|         public System.Windows.Forms.HorizontalAlignment TextAlignM = HorizontalAlignment.Left;
 | |
|         public System.Windows.Forms.HorizontalAlignment TextAlignBL = HorizontalAlignment.Left;
 | |
|         public System.Windows.Forms.HorizontalAlignment TextAlignBR = HorizontalAlignment.Right;
 | |
| 
 | |
|         public Boolean Enable_MultiBox = false;
 | |
| 
 | |
|         public event EventHandler<ItemClickEvent> ItemClick;
 | |
|         public event EventHandler<MessageEvent> Message;
 | |
| 
 | |
|         public UInt16 GetMaxPageCount
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (GridItemCount == 0) return 0;
 | |
|                 return (UInt16)(Math.Ceiling(Slots.Count * 1.0 / GridItemCount));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public UInt16 Page
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _page;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 if (value < 1) value = 1;
 | |
|                 UInt16 MaxPage = GetMaxPageCount;
 | |
|                 if (MaxPage < 1) MaxPage = 1;
 | |
|                 if (value > MaxPage) value = MaxPage;
 | |
|                 if (value != _page)
 | |
|                 {
 | |
|                     _page = value;
 | |
|                     bRePaint = true;
 | |
|                     this.Invalidate();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         public cmsview()
 | |
|         {
 | |
|             this.SetStyle(ControlStyles.UserPaint, true);
 | |
|             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
 | |
|             this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
 | |
|             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
 | |
| 
 | |
|             // Redraw when resized
 | |
|             this.SetStyle(ControlStyles.ResizeRedraw, true);
 | |
|             this.Resize += arLabel_Resize;
 | |
|             this.MouseDown += cmsview_MouseDown;
 | |
| 
 | |
|             this._page = 1;
 | |
|             ItemMargin = 3;
 | |
|             this.GridCount = new Point(8, 12);
 | |
|             Font_No = new Font("Consolas", 15f);
 | |
|             Font_Bottom = new Font("Consolas", 8f);
 | |
|             Font_Top = new Font("Consolas", 8f);
 | |
|             bRePaint = false;
 | |
|             isDebug = false;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         public void RaiseMessage(Boolean iserr, string msg)
 | |
|         {
 | |
|             if (Message != null)
 | |
|                 Message(this, new MessageEvent(iserr, msg));
 | |
|         }
 | |
|         public void ClearSelectItem()
 | |
|         {
 | |
|             foreach (var no in preSelectedIndex)
 | |
|                 this.Slots[no].Selected = false;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 지정한 index 의 아이템을 선택합니다. 페이지는 자동 전환됩니다.
 | |
|         /// </summary>
 | |
|         /// <param name="idx"></param>
 | |
|         public Boolean SelectItem(int idx)
 | |
|         {
 | |
|             ushort newPage = (ushort)(Math.Ceiling((double)(idx + 1) / GridItemCount));
 | |
|             if (newPage != this._page) Page = newPage;
 | |
| 
 | |
|             if (idx >= Slots.Count)
 | |
|             {
 | |
|                 RaiseMessage(true, "Index (" + idx.ToString() + ")Range Error ItemCount=" + this.Slots.Count.ToString());
 | |
|                 return false; //존재하지않는 아이템이다.
 | |
|             }
 | |
|             Slots[idx].Selected = true;
 | |
| 
 | |
| 
 | |
|             if (ItemClick != null)
 | |
|                 ItemClick(this, new ItemClickEvent(Point.Empty, idx, MouseButtons.Left, eClickArea.No));
 | |
| 
 | |
|             //이전에 선택된 것은 제거한다.
 | |
|             ClearPreSelected();
 | |
|             preSelectedIndex.Add(idx);
 | |
| 
 | |
|             this.Invalidate();
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// id가 일치하는 대상을 모두 찾습니다.
 | |
|         /// </summary>
 | |
|         /// <param name="ID1"></param>
 | |
|         public int SelectItem(string ID1, string ID2)
 | |
|         {
 | |
|             int retval = 0;
 | |
| 
 | |
|             //이전에 선택된 것은 제거한다.
 | |
|             ClearPreSelected();
 | |
| 
 | |
|             //자식데이터가 속해있다면 그것들을 모두 체크해야한다.
 | |
|             var items = this.Items.Where(t => t.ID1 == ID1 && t.ID2 == ID2);
 | |
|             if (items.Count() < 1)
 | |
|             {
 | |
|                 RaiseMessage(false, "Not Found UID=" + ID1);
 | |
|                 return retval;
 | |
|             }
 | |
| 
 | |
|             //해당 자식들이 속해잇는 슬롯을 모두 선택해준다.
 | |
|             foreach (var item in items)
 | |
|             {
 | |
|                 if (item.SlotIDX < this.Slots.Count)
 | |
|                 {
 | |
|                     var slot = this.Slots[item.SlotIDX];
 | |
|                     if (!slot.Selected)
 | |
|                     {
 | |
|                         slot.Selected = true;
 | |
|                         retval += 1;
 | |
|                         preSelectedIndex.Add(slot.Index);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             ushort newPage = 1;
 | |
|             if (preSelectedIndex.Count > 0)
 | |
|                 newPage = (ushort)(Math.Ceiling((double)(preSelectedIndex[preSelectedIndex.Count - 1] + 1) / GridItemCount));
 | |
| 
 | |
|             if (newPage != this._page) Page = newPage;
 | |
| 
 | |
|             if (ItemClick != null && preSelectedIndex.Count > 0)
 | |
|                 ItemClick(this, new ItemClickEvent(Point.Empty, preSelectedIndex[0], MouseButtons.Left, eClickArea.No));
 | |
| 
 | |
|             this.Invalidate();
 | |
|             return retval;
 | |
|         }
 | |
|         public int SelectItem(string ID1)
 | |
|         {
 | |
|             int retval = 0;
 | |
| 
 | |
|             //이전에 선택된 것은 제거한다.
 | |
|             ClearPreSelected();
 | |
| 
 | |
|             //자식데이터가 속해있다면 그것들을 모두 체크해야한다.
 | |
|             var items = this.Items.Where(t => t.ID1 == ID1);
 | |
|             if (items.Count() < 1)
 | |
|             {
 | |
|                 RaiseMessage(false, "Not Found UID=" + ID1);
 | |
|                 return 0;
 | |
|             }
 | |
| 
 | |
|             //해당 자식들이 속해잇는 슬롯을 모두 선택해준다.
 | |
|             foreach (var item in items)
 | |
|             {
 | |
|                 if (item.SlotIDX < this.Slots.Count)
 | |
|                 {
 | |
|                     var slot = this.Slots[item.SlotIDX];
 | |
|                     if (!slot.Selected)
 | |
|                     {
 | |
|                         slot.Selected = true;
 | |
|                         retval += 1;
 | |
|                         preSelectedIndex.Add(slot.Index);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             ushort newPage = 1;
 | |
|             if (preSelectedIndex.Count > 0)
 | |
|                 newPage = (ushort)(Math.Ceiling((double)(preSelectedIndex[preSelectedIndex.Count - 1] + 1) / GridItemCount));
 | |
| 
 | |
|             if (newPage != this._page) Page = newPage;
 | |
| 
 | |
|             this.Invalidate();
 | |
|             return retval;
 | |
|         }
 | |
| 
 | |
|         public List<int> preSelectedIndex = new List<int>();
 | |
| 
 | |
|         void cmsview_MouseDown(object sender, MouseEventArgs e)
 | |
|         {
 | |
|             //클릭을 하면 어떤개체가 
 | |
|             if (GridItemCount < 1 || Slots.Count < 1)
 | |
|             {
 | |
|                 RaiseMessage(true, "No items");
 | |
|                 return;
 | |
|             }
 | |
|             int StartIndex = (this.Page - 1) * GridItemCount;
 | |
|             for (int i = StartIndex; i < (StartIndex + GridItemCount); i++)
 | |
|             {
 | |
|                 if (i < Slots.Count)
 | |
|                 {
 | |
|                     var item = Slots[i];
 | |
|                     if (item.Rect.Contains(e.Location))
 | |
|                     {
 | |
|                         eClickArea area = eClickArea.Normal;
 | |
|                         if (item.RectNo.Contains(e.Location)) area = eClickArea.No;
 | |
|                         else if (item.RectM.Contains(e.Location)) area = eClickArea.Title;
 | |
|                         else if (item.RectB.Contains(e.Location)) area = eClickArea.Content;
 | |
| 
 | |
|                         item.Selected = true;
 | |
|                         if (ItemClick != null)
 | |
|                             ItemClick(this, new ItemClickEvent(e.Location, item.Index, e.Button, area));
 | |
| 
 | |
|                         ClearPreSelected();
 | |
|                         preSelectedIndex.Add(item.Index);
 | |
|                         item.Selected = true;
 | |
| 
 | |
|                         this.Invalidate();
 | |
| 
 | |
|                         break;
 | |
|                     }
 | |
|                 }
 | |
|                 else break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void ClearPreSelected()
 | |
|         {
 | |
|             //이전에 선택된 것은 제거한다.
 | |
|             foreach (var index in preSelectedIndex)
 | |
|                 if (index < Slots.Count) Slots[index].Selected = false;
 | |
|             preSelectedIndex.Clear();
 | |
|         }
 | |
|         void arLabel_Resize(object sender, EventArgs e)
 | |
|         {
 | |
|             bRePaint = true;
 | |
|             Invalidate();
 | |
|         }
 | |
| 
 | |
|         int cnt = 0;
 | |
|         protected override void OnPaint(PaintEventArgs pe)
 | |
|         {
 | |
|             base.OnPaint(pe);
 | |
|             cnt += 1;
 | |
| 
 | |
|             int StartIndex = (this.Page - 1) * GridItemCount;
 | |
| 
 | |
|             if (GridItemCount < 1)
 | |
|             {
 | |
|                 DrawHelp(pe.Graphics);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 ///테스트로 데이터를 만든다.
 | |
|                 if (Slots.Count < 1)
 | |
|                 {
 | |
|                     for(int i = 0; i < this.GridItemCount;i++)
 | |
|                     {
 | |
|                         Slots.Add(new Slot()
 | |
|                         {
 | |
|                             BackColor = Color.Lime,
 | |
|                             BorderColor = Color.Gray,
 | |
|                             BorderSize = 2f,
 | |
|                             Enable = true,
 | |
|                             ForeColor = Color.Black,
 | |
|                             Name = "test" + i.ToString(),
 | |
|                             Index = (byte)i,
 | |
|                             No = (i+1).ToString(),
 | |
|                             Selected = false
 | |
|                         });
 | |
|                     }
 | |
|                     bRePaint = true;
 | |
| 
 | |
| 
 | |
|                 }
 | |
| 
 | |
|                 //영역을 다시그려야하는 상황
 | |
|                 if (bRePaint && GridItemCount > 0 && Slots.Count > 0)
 | |
|                 {
 | |
|                     int gridW = (int)((this.Width - this.Padding.Left - this.Padding.Right) / GridCount.X);
 | |
|                     int gridH = (int)((this.Height - this.Padding.Top - this.Padding.Bottom) / GridCount.Y);
 | |
| 
 | |
|                     Rectangle rect, rect2, rectNo, rectT, rectM, rectB, rectCNT;
 | |
|                     int idx = 0;
 | |
|                     for (int r = 0; r < GridCount.Y; r++)
 | |
|                     {
 | |
|                         for (int c = 0; c < GridCount.X; c++)
 | |
|                         {
 | |
|                             int x = (c * gridW);
 | |
|                             int y = (r * gridH);
 | |
|                             rect = new Rectangle(x + this.Padding.Left, y + this.Padding.Top, gridW, gridH);
 | |
|                             rect2 = new Rectangle(
 | |
|                                 rect.Left + this.ItemMargin,
 | |
|                                 rect.Top + ItemMargin,
 | |
|                                 rect.Width - ItemMargin * 2,
 | |
|                                 rect.Height - ItemMargin * 2);
 | |
| 
 | |
|                             float NoWidth = NoStrSize; // rect2.Width * 0.2f;
 | |
|                             rectNo = new Rectangle(rect2.Left, rect2.Top, (int)NoWidth, (int)(rect2.Height * 0.3));
 | |
|                             var dispHeight1 = (int)(rect2.Height * 0.3);
 | |
|                             var dispHeight2 = (int)(rect2.Height * 0.4);
 | |
|                             var dispHeight3 = rect2.Height - dispHeight1 - dispHeight2;
 | |
|                             rectT = new Rectangle(rectNo.Right, rect2.Top, rect2.Width - rectNo.Width, dispHeight1); ;
 | |
|                             rectM = new Rectangle(rectNo.Left, rectT.Bottom, rect2.Width, dispHeight2);
 | |
|                             rectB = new Rectangle(rectNo.Left, rectM.Bottom, (int)(rect2.Width / 2.0), dispHeight3);
 | |
|                             rectCNT = new Rectangle(rectB.Right, rectM.Bottom, (int)(rect2.Width / 2.0), dispHeight3);
 | |
| 
 | |
|                             if (StartIndex + idx < Slots.Count)
 | |
|                             {
 | |
|                                 //items[StartIndex + idx].No = (byte)( idx + 1);
 | |
|                                 Slots[StartIndex + idx].Rect = rect2;
 | |
|                                 Slots[StartIndex + idx].RectNo = rectNo;
 | |
|                                 Slots[StartIndex + idx].RectT = rectT;
 | |
|                                 Slots[StartIndex + idx].RectM = rectM;
 | |
|                                 Slots[StartIndex + idx].RectB = rectB;
 | |
|                                 Slots[StartIndex + idx].RectCnt = rectCNT;
 | |
|                                 Slots[StartIndex + idx].ForeColor = this.ForeColor;
 | |
|                                 idx += 1;
 | |
|                             }
 | |
|                             else break;
 | |
|                         }
 | |
|                         if (StartIndex + idx >= Slots.Count) break;
 | |
|                     }
 | |
|                     bRePaint = false;
 | |
|                 }
 | |
| 
 | |
|                 for (int i = StartIndex; i < StartIndex + GridItemCount; i++)
 | |
|                 {
 | |
|                     if (i >= Slots.Count) break; //over check
 | |
|                     var item = Slots[i];
 | |
|                     var slotItems = Items.Where(t => t.SlotIDX == item.Index);
 | |
|                     DrawSlot(pe.Graphics, item, slotItems);
 | |
|                 }
 | |
| 
 | |
|                 if (isDebug)
 | |
|                 {
 | |
|                     using (Font f = new Font("Consolas", 15))
 | |
|                     {
 | |
|                         System.Text.StringBuilder sb = new StringBuilder();
 | |
|                         sb.AppendLine("## Debug Message ##");
 | |
|                         sb.AppendLine("Step : " + this.step.ToString());
 | |
|                         sb.AppendLine("Refresh Count : " + this.cnt.ToString());
 | |
|                         sb.AppendLine("Slot count : " + Slots.Count.ToString());
 | |
|                         sb.AppendLine("Item Count : " + Items.Count.ToString());
 | |
| 
 | |
|                         sb.AppendLine("font no : " + this.Font_No.ToString());
 | |
|                         sb.AppendLine("font top : " + this.Font_Top.ToString());
 | |
|                         sb.AppendLine("font mid : " + this.Font.ToString());
 | |
|                         sb.AppendLine("font bot : " + this.Font_Bottom.ToString());
 | |
|                         sb.Append("Pre Selected index : ");
 | |
|                         foreach (var item in preSelectedIndex)
 | |
|                             sb.Append(item + ",");
 | |
| 
 | |
|                         if (preSelectedIndex.Count == 1)
 | |
|                         {
 | |
|                             //세부내역도 표시한다.
 | |
|                             var slot = this.Slots[preSelectedIndex[0]];
 | |
|                             var items = this.Items.Where(t => t.SlotIDX == slot.Index);
 | |
|                             foreach (var item in items)
 | |
|                             {
 | |
|                                 sb.Append("item " + item.ID1 + ",qty=" + item.Qty.ToString());
 | |
|                             }
 | |
|                         }
 | |
|                         pe.Graphics.DrawString(sb.ToString(), f, Brushes.Black, 11f, 11f);
 | |
|                         pe.Graphics.DrawString(sb.ToString(), f, Brushes.Yellow, 10f, 10f);
 | |
|                     }
 | |
| 
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|         }
 | |
|         void DrawHelp(Graphics g)
 | |
|         {
 | |
|             System.Text.StringBuilder sb = new StringBuilder();
 | |
|             sb.AppendLine("컨트롤 설정이 완료되지 않았습니다.\n");
 | |
|             sb.AppendLine("이 메세지는 GRID COUNT가 설정되지 않았거나 ITEMS 항목이 없는 경우 표시됩니다.");
 | |
|             sb.AppendLine("ITEMS 갯수가 GRID 갯수를 넘을 경우 페이지가 분리됩니다.\n");
 | |
|             sb.AppendLine("현재 GRID 갯수는 : " + GridCount.ToString() + " = " + GridItemCount.ToString() + " 입니다.");
 | |
|             sb.AppendLine("현재 ITEM 갯수는 : " + Slots.Count.ToString() + " 입니다.\n");
 | |
|             sb.AppendLine("화면에 5x10 의 배열로 표시를 하려면 GridCount에 5x10을 설정하세요.");
 | |
|             sb.AppendLine("ITEMS 는 코드상에서 입력하세요.\n");
 | |
|             sb.AppendLine("# Example #");
 | |
|             sb.AppendLine("var newitem = new CMSControl.Item();");
 | |
|             sb.AppendLine("newitem.No = \"--\";");
 | |
|             sb.AppendLine("newitem.Title = \"ItemName\"");
 | |
|             sb.AppendLine("newitem.Contents = \"Model No\";");
 | |
|             sb.AppendLine("cmsview1.items.Add(newitem);");
 | |
| 
 | |
|             g.DrawString(sb.ToString(), this.Font, Brushes.Red, 10f, 10f);
 | |
| 
 | |
|         }
 | |
| 
 | |
|         public Color slotColorUnUsed = Color.DimGray;
 | |
|         public Color slotColorDisable = Color.Gray;
 | |
|         public Color slotColorSelect = Color.Lime;
 | |
| 
 | |
|         void DrawSlot(Graphics g, Slot slot, IEnumerable<Item> items)
 | |
|         {
 | |
|             if (slot.Rect.IsEmpty) return;
 | |
| 
 | |
|             //fill background color
 | |
|             g.FillRectangle(Brushes.Gray, slot.Rect);
 | |
| 
 | |
|             Color bdColor = Color.FromArgb(194, 192, 194);
 | |
|             Color bColor = slot.BackColor;
 | |
|             float bSize = 1.0f;
 | |
|             if (slot.Selected)
 | |
|             {
 | |
|                 bSize = 5.5f;
 | |
|                 //bColor = slotColorSelect;
 | |
|                 bdColor = Color.Lime;
 | |
|             }
 | |
|             else if (slot.Index == LastContactSlotIDX)
 | |
|             {
 | |
|                 bdColor = Color.Yellow;
 | |
|                 bSize = 5.5f;
 | |
|             }
 | |
| 
 | |
|             if (!slot.Enable) bColor = slotColorDisable;
 | |
|             else if (items.Count() < 1) bColor = slotColorUnUsed;
 | |
| 
 | |
| 
 | |
|             //no Color.FromArgb(231, 229, 231)
 | |
|             byte R = bColor.R;
 | |
|             byte G = bColor.G;
 | |
|             byte B = bColor.B;
 | |
|             if (R > 22) R -= 22; else R = 0;
 | |
|             if (G > 22) G -= 22; else G = 0;
 | |
|             if (B > 22) B -= 22; else B = 0;
 | |
| 
 | |
|             Color bgColor2 = Color.FromArgb(R, G, B);
 | |
|             using (LinearGradientBrush brush = new LinearGradientBrush(slot.RectNo, bColor, bgColor2, LinearGradientMode.Vertical))
 | |
|             {
 | |
|                 g.FillRectangle(brush, slot.RectNo);
 | |
|             }
 | |
|             g.DrawRectangle(new Pen(bColor), slot.RectNo);
 | |
| 
 | |
|             if (slot.Opend)
 | |
|             {
 | |
|                 if (slot.BorderColor == Color.Yellow) bdColor = Color.Tomato;
 | |
|                 else bdColor = Color.Yellow;
 | |
|                 bSize = 5.0f;
 | |
|             }
 | |
| 
 | |
|             Boolean ItemQtyManage = true;
 | |
|             Boolean ItemQtySummary = false;
 | |
|             Boolean ItemExpManage = false;
 | |
| 
 | |
|             if (items.Count() > 0)
 | |
|             {
 | |
|                 var itemInfo = items.First();
 | |
|                 ItemQtyManage = itemInfo.QtyManage;
 | |
|                 ItemQtySummary = itemInfo.QtySummary;
 | |
|                 ItemExpManage = itemInfo.ExpManage;
 | |
|             }
 | |
| 
 | |
|             //아이템이 여러개 있다면 우측 상단에 책갈피 처럼 표시한다.
 | |
|             if (items.Count() > 1)
 | |
|             {
 | |
|                 Rectangle openrect = new Rectangle(
 | |
|                     (int)(slot.Rect.Right - 15),
 | |
|                     (int)(slot.Rect.Top + 1),
 | |
|                     15, 15);
 | |
| 
 | |
|                 Point[] pts = new Point[4];
 | |
|                 pts[0] = new Point(slot.Rect.Right - 30, slot.Rect.Top + 1);
 | |
|                 pts[1] = new Point(slot.Rect.Right - 1, slot.Rect.Top + 1);
 | |
|                 pts[2] = new Point(slot.Rect.Right - 1, slot.Rect.Top + 30);
 | |
|                 pts[3] = new Point(slot.Rect.Right - 30, slot.Rect.Top + 1);
 | |
|                 g.FillPolygon(new SolidBrush(Color.FromArgb(40, 40, 40)), pts);
 | |
| 
 | |
|                 using (Font f = new Font("맑은 고딕", 10f))
 | |
|                     DrawString(g, f, items.Count().ToString(), openrect, Color.White, 0);
 | |
|             }
 | |
| 
 | |
|             string slotnoStr = (slot.Index + 1).ToString();
 | |
|             if (slot.No != "") slotnoStr = slot.No; //180607
 | |
| 
 | |
|             if (slot.Enable)
 | |
|             {
 | |
|                 string StrT = slot.Name;
 | |
|                 string StrM = string.Empty;
 | |
|                 string StrBL = string.Empty;
 | |
|                 string StrBR = string.Empty;
 | |
| 
 | |
|                 //값이없는 경우 세부항목에서 가져온다.
 | |
|                 var subItems = items.ToArray<Item>();
 | |
|                 if (StrT == "")
 | |
|                 {
 | |
|                     StrT = ParserMessage(DisplayT, subItems); // subItems[0].ID1 + "\n" + subItems[0].VNAME;
 | |
|                 }
 | |
|                 if (subItems.Count() > 0)
 | |
|                 {
 | |
|                     StrM = ParserMessage(DisplayM, subItems);// subItems[0].Name;
 | |
|                     StrBL = ParserMessage(DisplayBL, subItems);// subItems[0].Model;
 | |
|                     StrBR = ParserMessage(DisplayBR, subItems);// "[" + subItems[0].Qty.ToString() + subItems[0].Unit + "]";
 | |
|                 }
 | |
| 
 | |
|                 //g.DrawRectangle(new Pen(Color.Magenta, 1.5f), RectT);
 | |
|                 //g.DrawRectangle(new Pen(Color.Red, 1.5f), RectM);
 | |
|                 //g.DrawRectangle(new Pen(Color.Yellow, 1.5f), RectB);
 | |
|                 //g.DrawRectangle(new Pen(Color.Yellow, 1.5f),);
 | |
| 
 | |
|                 DrawString(g, Font_No, slotnoStr, slot.RectNo, color_font_no, HorizontalAlignment.Center, Padding_No);
 | |
| 
 | |
|                 //title
 | |
|                 if (StrT != "")
 | |
|                     DrawString(g, Font_Top, StrT, slot.RectT, color_font_top, TextAlignT, Padding_Top);
 | |
|                 if (StrM != "")
 | |
|                     DrawString(g, Font_Middle, StrM, slot.RectM, color_font_middle, TextAlignM, Padding_Middle);
 | |
|                 if (StrBL != "")
 | |
|                     DrawString(g, Font_Bottom, StrBL, slot.RectB, color_font_bottom_left, TextAlignBL, Padding_Bottom);
 | |
|                 if (StrBR != "" && ItemQtyManage)
 | |
|                     DrawString(g, Font_Count, StrBR, slot.RectCnt, color_font_bottom_right, TextAlignBR, Padding_Count);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 DrawString(g, this.Font_No, slotnoStr, slot.RectNo, color_font_no);
 | |
|                 DrawString(g, this.Font_Middle, "Disabled", slot.RectM, color_font_no);
 | |
|                 //DrawString(g, fConttent, "DISABLED", RectT, Color.Black, 0);
 | |
|             }
 | |
| 
 | |
|             //g.DrawRectangle(Pens.White, slot.RectT);
 | |
|             //g.DrawRectangle(Pens.White, slot.RectM);
 | |
|             //g.DrawRectangle(Pens.White, slot.RectB);
 | |
|             //g.DrawRectangle(Pens.White, slot.RectCnt);
 | |
|             //g.DrawString(items.Count().ToString(), fNo, Brushes.Red, Rect.Left, Rect.Top);
 | |
| 
 | |
|             g.DrawLine(new Pen(Color.Black, 5f), slot.Rect.Left + 3, slot.Rect.Bottom + 1, slot.Rect.Right + 2, slot.Rect.Bottom + 1);
 | |
|             g.DrawLine(new Pen(Color.Black, 5f), slot.Rect.Right + 1, slot.Rect.Top + 3, slot.Rect.Right + 1, slot.Rect.Bottom + 4);
 | |
|             //g.DrawRectangle(Pens.Black, slot.Rect.Left + 1, slot.Rect.Top + 1, slot.Rect.Width - 2, slot.Rect.Height - 2);
 | |
| 
 | |
|             using (Pen p = new Pen(bdColor, bSize))
 | |
|             {
 | |
|                 g.DrawRectangle(p, slot.Rect); //최종테두리
 | |
|             }
 | |
| 
 | |
|             slot.BorderColor = bdColor;
 | |
|             //g.DrawString(this.BackColor.ToString(), fID, Brushes.Black,RectNo.Left, RectNo.Top);
 | |
| 
 | |
|             if (slot.Expiration)
 | |
|             {
 | |
|                 string msg = "Expiration";
 | |
|                 var fsize = g.MeasureString(msg, this.Font);
 | |
|                 var rectheight = (int)(fsize.Height * 1.5);
 | |
|                 Rectangle msgRect = new Rectangle(slot.Rect.Left + 1, slot.Rect.Bottom - rectheight, slot.Rect.Width - 1, rectheight);
 | |
|                 g.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Red)), msgRect);
 | |
|                 DrawString(g, this.Font, msg, msgRect, Color.White);
 | |
|                 //g.DrawString("expiration", this.Font, Brushes.White, msgRect.Left, msgRect.Top);
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         string ParserMessage(string org, Item[] subItems)
 | |
|         {
 | |
|             org = org.Replace("\\n", "\n");
 | |
|             if (subItems.Length > 0)
 | |
|             {
 | |
|                 var item = subItems[0];
 | |
|                 org = org.Replace("{ID1}", item.ID1);
 | |
|                 org = org.Replace("{ID2}", item.ID2);
 | |
|                 org = org.Replace("{NAME}", item.Name);
 | |
|                 org = org.Replace("{MODEL}", item.Model);
 | |
|                 org = org.Replace("{SERIAL}", item.Serial);
 | |
| 
 | |
|                 if (item.ScaleUnit != item.Unit && item.ScaleUnit != "")
 | |
|                 {
 | |
|                     org = org.Replace("{QTY}", (item.Qty / item.Scale).ToString());
 | |
|                     org = org.Replace("{UNIT}", item.ScaleUnit);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     org = org.Replace("{QTY}", item.Qty.ToString());
 | |
|                     org = org.Replace("{UNIT}", item.Unit);
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 org = org.Replace("{ID1}", string.Empty);
 | |
|                 org = org.Replace("{ID2}", string.Empty);
 | |
|                 org = org.Replace("{NAME}", string.Empty);
 | |
|                 org = org.Replace("{MODEL}", string.Empty);
 | |
|                 org = org.Replace("{SERIAL}", string.Empty);
 | |
|                 org = org.Replace("{QTY}", string.Empty);
 | |
|                 org = org.Replace("{UNIT}", string.Empty);
 | |
|             }
 | |
|             return org;
 | |
|         }
 | |
| 
 | |
|         void DrawString(Graphics g, Font f, string data, Rectangle rect, Color fcolor, System.Windows.Forms.HorizontalAlignment align = HorizontalAlignment.Center, Padding pad = new Padding())
 | |
|         {
 | |
|             var fsize = g.MeasureString(data, f);
 | |
|             float cx, cy;
 | |
|             cx = cy = 0;
 | |
|             switch (align)
 | |
|             {
 | |
|                 case HorizontalAlignment.Left:
 | |
|                     cx = pad.Left + rect.Left;
 | |
|                     cy = pad.Top + rect.Top + (rect.Height - fsize.Height) / 2.0f;
 | |
|                     break;
 | |
|                 case HorizontalAlignment.Center:
 | |
|                     cx = pad.Left + rect.Left + (rect.Width - fsize.Width) / 2.0f;
 | |
|                     cy = pad.Top + rect.Top + (rect.Height - fsize.Height) / 2.0f;
 | |
|                     break;
 | |
|                 case HorizontalAlignment.Right:
 | |
|                     cx = rect.Right - fsize.Width - pad.Right;
 | |
|                     cy = pad.Top + rect.Top + (rect.Height - fsize.Height) / 2.0f;
 | |
|                     break;
 | |
|             }
 | |
| 
 | |
|             g.DrawString(data, f, new SolidBrush(fcolor), new PointF(cx + 1, cy + 1));
 | |
|         }
 | |
|     }
 | |
| }
 | 
