Exemplo n.º 1
0
        private static void GlobalUpdateSelection(object sender, SelectionChangedEventArgs e)
        {
            ObjectInspector target = null;

            foreach (ObjectSelection.Category cat in ObjectSelection.EnumerateCategories(e.AffectedCategories))
            {
                var objViews =
                    from v in ObjectInspectorPlugin.Instance.ObjViews
                    where v.AcceptsSelection(e.Current)
                    select new {
                    View            = v,
                    Empty           = v.EmptySelection,
                    PerfectFit      = v.EmptySelection || (cat & v.DisplayedCategory) != ObjectSelection.Category.None,
                    TypeShare       = ObjectSelection.GetTypeShareLevel(e.Current.Exclusive(cat), v.DisplayedSelection),
                    NumSameCatViews = ObjectInspectorPlugin.Instance.ObjViews.Count(o => o.AcceptsSelection(e.Current) && o.DisplayedCategory == v.DisplayedCategory)
                };
                var sortedQuery =
                    from o in objViews
                    orderby o.PerfectFit descending, o.Empty ascending, o.NumSameCatViews descending, o.TypeShare ascending
                select o;
                var targetItem = sortedQuery.FirstOrDefault();
                if (targetItem == null)
                {
                    return;
                }
                target = targetItem.View;

                // If a mouse button is pressed, reschedule the selection for later - there might be a drag in progress
                if (Control.MouseButtons != System.Windows.Forms.MouseButtons.None)
                {
                    target.selSchedMouse            = e.Current;
                    target.selSchedMouseCat         = cat;
                    target.timerSelectSched.Enabled = true;
                }
                else
                {
                    target.UpdateSelection(e.Current, cat);
                }
            }

            //  Make sure disposed objects are deselected in non-target views (locked, etc.)
            foreach (ObjectInspector v in ObjectInspectorPlugin.Instance.ObjViews)
            {
                if (v.EmptySelection)
                {
                    continue;
                }
                if (v == target)
                {
                    continue;
                }

                var disposedObj = e.Removed.OfType <IManageableObject>().Where(o => o.Disposed);
                if (disposedObj.Any())
                {
                    ObjectSelection disposedSel = new ObjectSelection(disposedObj);
                    v.UpdateSelection(v.DisplayedSelection - disposedSel, v.DisplayedCategory);
                }
            }
        }