Saturday, March 12, 2016

C# windows formada sodda Drag & Drop. 3- versiya

Windows Formada dizaynda ishlash murakkab. Drag&Drop  - dasturga o`zgacha ko`rinish beradi va bu ajoyib imkoniyat ham. Uning tayyor kodini olib ishlatish esa undanda ko`proq zavq-shavq beradi :-) 

Oldingi versiyada aytilganidek biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolinadi va unga Action bajartiriladi. DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ldi.
Shuningdek har bir panel tepasiga sarlavha ko`rinishida soha nomini yozib qo`yish mumkin, hamda sohalarga border rangini ham tanlash mumkin bo`ldi.






using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;

namespace Library.Controls
{
    public class DragDropContainer : Control
    {
        private readonly Panel _content = new Panel
        {
            Dock = DockStyle.Fill,
            Padding = new Padding(0)
        };

        private readonly Panel _header = new Panel
        {
            Padding = new Padding(0),
            Height = 20,
            Dock = DockStyle.Top
        };

        private Action _action;
        private bool _mouseDown;
        private string _oldPosition;
        private Point _point = new Point(0, 0);

        public DragDropContainer()
        {
            Controls.Add(_header);
            Controls.Add(_content);
            _content.BringToFront();
        }

        public int ColumnCount { get; set; }
        public Color BorderColor { get; set; } = Color.FromArgb(202, 210, 214);
        public IEnumerable> Child => _content.Controls.OfType().Select(x => x.Child);
        public IEnumerable
        public IEnumerable Panels => _content.Controls.OfType();

        protected override void InitLayout()
        {
            base.InitLayout();

            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width/ColumnCount,
                    Dock = DockStyle.Right,
                    Padding = new Padding(5)
                };
                var label = new Label
                {
                    AutoSize = false,
                    Width = panel.Width,
                    Padding = new Padding(0),
                    Dock = DockStyle.Right,
                    Name = "" + i,
                    TextAlign = ContentAlignment.MiddleCenter
                };
                _content.Controls.Add(panel);
                _header.Controls.Add(label);

                PaintEventHandler paintAction =
                    (sender, args) => ControlPaint.DrawBorder(args.Graphics, (sender as Control).ClientRectangle,
                        BorderColor, ButtonBorderStyle.Solid);
                label.Paint += paintAction;
                panel.Paint += paintAction;
            }
            SizeChanged +=
                (o, args) =>
                {
                    _content.Controls.OfType().ToList().ForEach(x => { x.Width = Width/ColumnCount; });
                    _header.Controls.OfType
                };
        }

        public void Add(Control control, int? position = null)
        {
            var panels = _content.Controls.OfType().ToArray();
            if (panels.Length < 1)
            {
                InitLayout();
                panels = _content.Controls.OfType().ToArray();
            }
            var dragDropPanel = position.HasValue
                ? panels[position.Value]
                : panels.FirstOrDefault(x => x.Controls.Count == panels.Min(t => t.Controls.Count));

            dragDropPanel?.AddControl(control, (sender, args) =>
            {
                //mouseDown
                var panel = control.Parent;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                panel.Dock = DockStyle.None;
                panel.BringToFront();
                _oldPosition = panel.Parent.Name;
            }, (sender, args) =>
            {
                //mouseUp
                var panel = control.Parent;
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                panel.BringToFront();
                if (panel.Parent.Name != _oldPosition)
                {
                    var newIndex = int.Parse(dragDropPanel.Name);
                    _action?.Invoke(newIndex, control);
                }
            }, (sender, args) =>
            {
                //mouseMove
                var panel = control.Parent;
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);

                    // next dragdroppanel
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (_content.Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = _content.Controls[panelIndex + 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                                panel.BringToFront();
                            }
                        }
                    }
                    // previous dragdroppanel
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (_content.Controls.Count > panelIndex - 1 && panelIndex > 0)
                        {
                            dragDropPanel = _content.Controls[panelIndex - 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                                panel.BringToFront();
                            }
                        }
                    }
                }
            });
        }

        public void Reset()
        {
            _header.Controls.OfType().ToList().ForEach(x => x.Dispose());
            _content.Controls.OfType().ToList().ForEach(x => x.Dispose());
            _header.Controls.Clear();
            _content.Controls.Clear();
        }

        public void SetHandler(Action action)
        {
            _action = action;
        }
    }

    [ToolboxItem(false)]
    internal class DragDropPanel : Panel
    {
        public IEnumerable Child => Controls.OfType().
            Select(x => x.Controls.OfType().FirstOrDefault(t => t.Dock != DockStyle.Left));

        public void AddControl(Control control,
            MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
        {
            new Thread(() => Invoke(new EventHandler((sender, args) =>
            {
                var panel = new Panel
                {
                    Size = new Size(Width, control.Height),
                    Dock = DockStyle.Top
                };
                var header = new Panel
                {
                    Dock = DockStyle.Left,
                    Width = 12,
                    BackgroundImage = Resources.arrow_move,
                    BackgroundImageLayout = ImageLayout.Zoom
                };
                Controls.Add(panel);
                panel.Controls.Add(header);
                panel.Controls.Add(control);

                control.Dock = DockStyle.Fill;
                control.BringToFront();
                panel.BringToFront();

                header.MouseDown += mouseDown;
                header.MouseUp += mouseUp;
                header.MouseMove += mouseMove;
            })))
            {IsBackground = true}.Start();
        }

        protected override void InitLayout()
        {
            base.InitLayout();
            AutoScroll = true;
        }
    }
}



Foydalanish

dragDropContainer1.ColumnCount = 5;
var linkLabel = new LinkLabel
                {
                    Name ="test1",
                    Text = "Ism Familiya"
                };
dragDropContainer1.Add(linkLabel, 1);
dragDropContainer1.Headers.FirstOrDefault().Text = "1-soha";
dragDropContainer1.Headers.ToArray()[2].Text = "2- soha";
dragDropContainer1.SetHandler((i, control) =>
            {
                MessageBox.Show(string.Format("{0},{1}", i, (control as LinkLabel)?.Text));
                var position = dragDropContainer1.Child;
            });

Friday, March 11, 2016

C# windows formada sodda Drag & Drop. 2- versiya

Bu versiyada panellar tartiblandi. Tartib chapdan o`ngga davom etadi.
DragDropContainer ga kiritilgan controllar qaysi o`rinda turgani ham ko`rish mumkin.


Keyingi versiyada har bir harakatni, biror paneldan boshqasiga ko`chirib o`tkazilganini tutib qolamiz va unga Action bajartiramiz. So`ng bu DragDropContainerdan TaskList yasashda foydalanish mumkin bo`ladi.

using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace ControlsLibrary.Controls
{
    public class DragDropContainer : Control
    {
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        public int ColumnCount { get; set; }
        public IEnumerable> Child => Controls.OfType().Select(x => x.Child);

        protected override void InitLayout()
        {
            base.InitLayout();

            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Right
                };
                Controls.Add(panel);
            }
            SizeChanged +=
                (o, args) =>
                {
                    Controls.OfType().ToList().ForEach(x => { x.Width = Width / ColumnCount; });
                };
        }

        public void Add(Control control, int? position = null)
        {
            var panels = Controls.OfType().ToArray();
            var dragDropPanel = position.HasValue
                ? panels[position.Value]
                : panels.FirstOrDefault(x => x.Controls.Count == panels.Min(t => t.Controls.Count));

            dragDropPanel?.AddControl(control, (sender, args) =>
            {//mouseDown
                var panel = control.Parent;
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                panel.Dock = DockStyle.None;
            }, (sender, args) =>
            {//mouseUp
                var panel = control.Parent;
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                panel.BringToFront();
            }, (sender, args) =>
            {//mouseMove
                var panel = control.Parent;
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);

                    // next dragdroppanel
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = Controls[panelIndex + 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                            }
                        }
                    }
                    // previous dragdroppanel
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex - 1 && panelIndex > 0)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            dragDropPanel?.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            });
        }
    }

    public class DragDropPanel : Panel
    {
        public LinkedList Child { get; } = new LinkedList();

        public void AddControl(Control control,
            MouseEventHandler mouseDown, MouseEventHandler mouseUp, MouseEventHandler mouseMove)
        {
            var panel = new Panel
            {
                Size = new Size(Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

            control.Dock = DockStyle.Fill;
            control.BringToFront();
            panel.BringToFront();

            header.MouseDown += mouseDown;
            header.MouseUp += mouseUp;
            header.MouseMove += mouseMove;

            Child.AddLast(control);
        }
    }
}


Foydalanish:

void Main(){
              var mainForm = new DragDropContainer
                {
                    Dock = DockStyle.Fill,
                    ColumnCount = 5
                };
                panel.Add(mainForm, "Home");
                mainForm.Add(new Button(),2);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button(),3);
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                mainForm.Add(new Button());
                var items = mainForm.Child;
}

Thursday, March 10, 2016

C# windows formada sodda Drag & Drop. 1- versiya

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Library.Controls
{
    public partial class DragDropContainer : UserControl
    {
        public DragDropContainer()
        {
            InitializeComponent();
        }

        public int ColumnCount { get; set; }

        private void DragDropContiner_Load(object sender, EventArgs e)
        {
            for (var i = 0; i < ColumnCount; i++)
            {
                var panel = new DragDropPanel
                {
                    Name = "" + i,
                    Width = Width / ColumnCount,
                    BorderStyle = BorderStyle.FixedSingle,
                    Dock = DockStyle.Left
                };
                Controls.Add(panel);
            }
            SizeChanged += (o, args) =>
            {
                Controls.OfType().ToList().ForEach(x =>
                {
                    x.Width = Width / ColumnCount;
                });
            };
        }
        private bool _mouseDown;
        private Point _point = new Point(0, 0);
        private Control _temp;
        public void Add(Control control)
        {
            var panels = Controls.OfType();
            var minControlsCount = panels.Min(x => x.Controls.Count);
            var dragDropPanel = panels.FirstOrDefault(x => x.Controls.Count == minControlsCount);
            var panel = new Panel
            {
                Size = new Size(dragDropPanel.Width, control.Height + 10),
                Dock = DockStyle.Top
            };
            var header = new Panel
            {
                Dock = DockStyle.Top,
                BackColor = Color.Aqua,
                Height = 10
            };
            dragDropPanel.Controls.Add(panel);
            panel.Controls.Add(header);
            panel.Controls.Add(control);

            control.Dock = DockStyle.Fill;
            control.BringToFront();
            panel.BringToFront();

            header.MouseDown += (sender, args) =>
            {
                if (args.Y > 10) return;
                panel.Cursor = Cursors.NoMove2D;
                _mouseDown = true;
                _point = args.Location;
                _temp = panel;
                panel.Dock = DockStyle.None;
            };
            header.MouseUp += (sender, args) =>
            {
                panel.Cursor = DefaultCursor;
                panel.Dock = DockStyle.Top;
                _mouseDown = false;
                _temp = null;
                panel.BringToFront();
            };
            header.MouseMove += (sender, args) =>
            {
                if (true.Equals(_mouseDown))
                {
                    panel.Location = new Point(panel.Location.X + args.X - _point.X,
                        panel.Location.Y + args.Y - _point.Y);
                    if (panel.Location.X + args.X > panel.Parent.Width)
                    {
                        var location = new Point(panel.Location.X - dragDropPanel.Width, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex - 1)
                        {
                            dragDropPanel = Controls[panelIndex - 1] as DragDropPanel;
                            if (dragDropPanel != null)
                            {
                                dragDropPanel.Controls.Add(panel);
                                panel.Location = location;
                            }
                        }
                    }
                    else if (panel.Location.X + args.X < 0)
                    {
                        var location = new Point(dragDropPanel.Width + panel.Location.X, panel.Location.Y);
                        var panelIndex = int.Parse(dragDropPanel.Name);
                        if (Controls.Count > panelIndex + 1)
                        {
                            dragDropPanel = Controls[panelIndex + 1] as DragDropPanel;
                            dragDropPanel.Controls.Add(panel);
                            panel.Location = location;
                        }
                    }
                }
            };
        }
    }
    public class DragDropPanel : Panel
    {
    }
}