public double DrawWork(int j, int need_proc_id, List<work_view> dependWorkList)
        {
            double start = 50;
            for (int o = 0; o < dependWorkList.Count; o++)
                foreach (sub_work_view sub_work in SubWorkList)
                    if (sub_work.to_id == TopListNew[j].id && sub_work.end_x > start)
                        start = sub_work.end_x;

            if (start == 50 && dependWorkList.Count > 0)
                start = dependWorkList[0].end_x;

            List<work_view> _work_new = new List<work_view>();
            double weight_node = interval_vertical * (int)Math.Ceiling(TopListNew[j].weight / proizvodProcessors);

            Dictionary<work_view, double> _dict_work = new Dictionary<work_view, double>();

            for (int m = 0; m < WorkList.Count; m++)
                if (WorkList[m].end_y == LinesHorizontal.Find(x => x.id.Equals(need_proc_id)).startY)
                    if (WorkList[m].end_x > start)
                        _dict_work.Add(WorkList[m], WorkList[m].end_x);

            _dict_work = _dict_work.OrderBy(pair => pair.Value).ToDictionary(pair => pair.Key, pair => pair.Value);

            foreach (var n_c in _dict_work)
                _work_new.Add(n_c.Key);

            if (_work_new.Count > 0)
                for (int m = 0; m < _work_new.Count; m++)
                {
                    double other_start_x = _work_new[m].end_x - _work_new[m].rect_width;

                    if ((start < other_start_x && (start + weight_node) >
                        other_start_x) || (start < _work_new[m].end_x &&
                        (start + weight_node) > other_start_x) || start == other_start_x)
                        start = _work_new[m].end_x;
                }

            _w_view = new work_view(this, TopListNew[j].id.ToString(), weight_node, start,
                LinesHorizontal.Find(x => x.id.Equals(need_proc_id)).startY - 20, need_proc_id);
            status[j] = true;

            return _w_view.end_x;
        }
        public void Planning(int destination_algorithm)
        {
            CSQueue();
            FillDependentNodes();
            MatrixCS();

            for (int i = 0, j = 0; j < TopListNew.Count && i < TopListCSNew.Count; j++)
                if (neighbors_nodes[TopListNew[j].id].Count == 0)
                {
                    double startY = LinesHorizontal.Find(x => x.id.Equals(TopListCSNew[i].id)).startY;

                    _w_view = new work_view(this, TopListNew[j].id.ToString(),
                        interval_vertical * (int)Math.Ceiling(TopListNew[j].weight / proizvodProcessors), 50,
                        startY - 20, TopListCSNew[i].id);
                    status[j] = true;
                    i++;
                }


            for (int j = 0; j < TopListNew.Count; j++)
                if (!status[j])
                {
                    List<int> depend = neighbors_nodes[TopListNew[j].id];
                    int count_depend_done = 0;
                    for (int k = 0; k < depend.Count; k++)
                    {
                        int index = 0;
                        for (index = 0; index < TopListNew.Count; index++)
                            if (TopListNew[index].id == depend[k])
                                break;
                        if (status[index])
                            count_depend_done++;
                    }
                    if (count_depend_done == depend.Count)
                    {
                        List<work_view> dependWorkList = new List<work_view>();
                        for (int k = 0; k < depend.Count; k++)
                            dependWorkList.Add(WorkList.Find(x => x.rect_id.Equals(depend[k])));

                        int need_proc_id = -1;
                        if (destination_algorithm == 4 || destination_algorithm == 5)
                            need_proc_id = FindNeedProcAlg4(j, depend, dependWorkList);
                        else if (destination_algorithm == 6)
                            need_proc_id = FindNeedProcAlg6(j, dependWorkList);
                        DrawSubWorks(destination_algorithm, j, need_proc_id, dependWorkList);
                        DrawWork(j, need_proc_id, dependWorkList);
                        
                        for (int k = 0; k < j; k++)
                            if (!status[k])
                            {
                                j = k - 1;
                                break;
                            }
                    }
                }
        }