Esempio n. 1
0
        public void Dock(DockObject requestor, DockPlacement position, object data)
        {
            if (requestor == null || requestor == this)
            {
                return;
            }

            if (master == null)
            {
                Console.WriteLine("Dock operation requested in a non-bound object {0}.", this);
                Console.WriteLine("This might break.");
            }

            if (!requestor.IsBound)
            {
                requestor.Bind(Master);
            }

            if (requestor.Master != Master)
            {
                Console.WriteLine("Cannot dock {0} to {1} as they belong to different masters.",
                                  requestor, this);
                return;
            }

            /* first, see if we can optimize things by reordering */
            if (position != DockPlacement.None)
            {
                DockObject parent = ParentObject;
                if (OnReorder(requestor, position, data) ||
                    (parent != null && parent.OnReorder(requestor, position, data)))
                {
                    return;
                }
            }

            /* freeze the object, since under some conditions it might
             * be destroyed when detaching the requestor */
            Freeze();

            /* detach the requestor before docking */
            if (requestor.IsAttached)
            {
                requestor.Detach(false);
            }

            /* notify interested parties that an object has been docked. */
            if (position != DockPlacement.None)
            {
                OnDocked(requestor, position, data);
                DockedHandler handler = Docked;
                if (handler != null)
                {
                    DockedArgs args = new DockedArgs(requestor, position);
                    handler(this, args);
                }
            }

            Thaw();
        }