public void RefreshCanvas()
        {
            if (PART_Canvas == null || rockRefresh || MatDataObjects == null) return;

            rockRefresh = true;

            for (int i = PART_Canvas.Children.Count - 1; i >= 0; i--)
            {
                MatDataObjectControl objc = PART_Canvas.Children[i] as MatDataObjectControl;
                if (objc != null)
                {
                    bool exist = false;

                    foreach (MatDataObject o in MatDataObjects)
                    {
                        if (objc.MyMatDataObject == o)
                            exist = true;
                    }

                    if (!exist)
                    {
                        objc.MyMatDataObject.DisconnectAll();

                        PART_Canvas.Children.Remove(objc);
                        ctrls.Remove(objc);
                        if (objc.MyMatDataObject is Module)
                            ((Module)objc.MyMatDataObject).IsUsing = false;
                    }
                }
            }

            foreach (MatDataObject o in MatDataObjects)
            {
                bool exist = false;

                foreach (UIElement e in PART_Canvas.Children)
                {
                    MatDataObjectControl objc = e as MatDataObjectControl;
                    if (objc != null && objc.MyMatDataObject == o)
                        exist = true;
                }

                if (!exist)
                {
                    MatDataObjectControl ctrl = new MatDataObjectControl(this)
                    {
                        MyMatDataObject = o
                    };

                    Module m = o as Module;
                    if (m != null)
                    {
                        ctrl.BorderBrush = new SolidColorBrush(Color.FromArgb(255, 200, 100, 100));
                    }

                    ctrl.StateChanged += Ctrl_StateChanged;
                    ctrls.Add(ctrl);
                    PART_Canvas.Children.Add(ctrl);
                }
            }

            Utility.UpdateUI();

            rockRefresh = false;

            RefreshLines();
        }
        private MatDataOutputPortControl SearchOutputPortControl(MatDataOutputPort port, MatDataObjectControl portIn)
        {
            foreach(UIElement uie in portIn.PART_Outputs.Children)
            {
                MatDataOutputPortControl outpc = uie as MatDataOutputPortControl;

                if (outpc != null && outpc.OutputPort == port)
                    return outpc;
            }

            return null;
        }