internal LayoutAnchorControl(LayoutAnchorable model) { _model = model; _model.IsActiveChanged += _model_IsActiveChanged; _model.IsSelectedChanged += _model_IsSelectedChanged; SetSide(_model.FindParent<LayoutAnchorSide>().Side); }
internal override void Detach() { _anchorable.IsVisibleChanged -= _anchorable_IsVisibleChanged; _anchorable = null; base.Detach(); }
internal override void Attach(LayoutContent model) { _anchorable = model as LayoutAnchorable; if (_anchorable != null) _anchorable.IsVisibleChanged += _anchorable_IsVisibleChanged; base.Attach(model); }
internal void _ExecuteAutoHideCommand(LayoutAnchorable anchorable) { anchorable.ToggleAutoHide(); }
private void CreateAnchorableLayoutItem(LayoutAnchorable contentToAttach) { if (_layoutItems.Any(item => Equals(item.LayoutElement, contentToAttach))) return; var layoutItem = new LayoutAnchorableItem(); layoutItem.Attach(contentToAttach); ApplyStyleToLayoutItem(layoutItem); _layoutItems.Add(layoutItem); if (contentToAttach?.Content is UIElement) { InternalAddLogicalChild(contentToAttach.Content); } }
private void AttachAnchorablesSource(LayoutRoot layout, IEnumerable anchorablesSource) { if (anchorablesSource == null) return; if (layout == null) return; var anchorablesImported = layout.Descendents().OfType<LayoutAnchorable>().Select(d => d.Content).ToArray(); var anchorables = anchorablesSource; var listOfAnchorablesToImport = new List<object>(anchorables.OfType<object>()); foreach ( var document in listOfAnchorablesToImport.ToArray().Where(document => anchorablesImported.Contains(document))) { listOfAnchorablesToImport.Remove(document); } LayoutAnchorablePane anchorablePane = null; if (layout.ActiveContent != null) { //look for active content parent pane anchorablePane = layout.ActiveContent.Parent as LayoutAnchorablePane; } if (anchorablePane == null) { //look for a pane on the right side anchorablePane = layout.Descendents() .OfType<LayoutAnchorablePane>() .FirstOrDefault(pane => !pane.IsHostedInFloatingWindow && pane.GetSide() == AnchorSide.Right); } if (anchorablePane == null) { //look for an available pane anchorablePane = layout.Descendents().OfType<LayoutAnchorablePane>().FirstOrDefault(); } _suspendLayoutItemCreation = true; foreach (var anchorableContentToImport in listOfAnchorablesToImport) { var anchorableToImport = new LayoutAnchorable() { Content = anchorableContentToImport }; bool added = false; if (LayoutUpdateStrategy != null) { added = LayoutUpdateStrategy.BeforeInsertAnchorable(layout, anchorableToImport, anchorablePane); } if (!added) { if (anchorablePane == null) { var mainLayoutPanel = new LayoutPanel { Orientation = Orientation.Horizontal }; if (layout.RootPanel != null) { mainLayoutPanel.Children.Add(layout.RootPanel); } layout.RootPanel = mainLayoutPanel; anchorablePane = new LayoutAnchorablePane { DockWidth = new GridLength(200.0, GridUnitType.Pixel) }; mainLayoutPanel.Children.Add(anchorablePane); } anchorablePane.Children.Add(anchorableToImport); } LayoutUpdateStrategy?.AfterInsertAnchorable(layout, anchorableToImport); CreateAnchorableLayoutItem(anchorableToImport); } _suspendLayoutItemCreation = false; var anchorablesSourceAsNotifier = anchorablesSource as INotifyCollectionChanged; if (anchorablesSourceAsNotifier != null) anchorablesSourceAsNotifier.CollectionChanged += AnchorablesSourceElementsChanged; }
private void AnchorablesSourceElementsChanged(object sender, NotifyCollectionChangedEventArgs e) { if (Layout == null) return; //When deserializing documents are created automatically by the deserializer if (SuspendAnchorablesSourceBinding) return; //handle remove if (e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Replace) { if (e.OldItems != null) { var anchorablesToRemove = Layout.Descendents() .OfType<LayoutAnchorable>() .Where(d => e.OldItems.Contains(d.Content)) .ToArray(); foreach (var anchorableToRemove in anchorablesToRemove) { anchorableToRemove.Parent.RemoveChild( anchorableToRemove); } } } //handle add if (e.NewItems != null && (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.Replace)) { if (e.NewItems != null) { LayoutAnchorablePane anchorablePane = null; if (Layout.ActiveContent != null) { //look for active content parent pane anchorablePane = Layout.ActiveContent.Parent as LayoutAnchorablePane; } if (anchorablePane == null) { //look for a pane on the right side anchorablePane = Layout.Descendents() .OfType<LayoutAnchorablePane>() .FirstOrDefault(pane => !pane.IsHostedInFloatingWindow && pane.GetSide() == AnchorSide.Right); } if (anchorablePane == null) { //look for an available pane anchorablePane = Layout.Descendents().OfType<LayoutAnchorablePane>().FirstOrDefault(); } _suspendLayoutItemCreation = true; foreach (var anchorableContentToImport in e.NewItems) { var anchorableToImport = new LayoutAnchorable { Content = anchorableContentToImport }; bool added = false; if (LayoutUpdateStrategy != null) { added = LayoutUpdateStrategy.BeforeInsertAnchorable(Layout, anchorableToImport, anchorablePane); } if (!added) { if (anchorablePane == null) { var mainLayoutPanel = new LayoutPanel { Orientation = Orientation.Horizontal }; if (Layout.RootPanel != null) { mainLayoutPanel.Children.Add(Layout.RootPanel); } Layout.RootPanel = mainLayoutPanel; anchorablePane = new LayoutAnchorablePane { DockWidth = new GridLength(200.0, GridUnitType.Pixel) }; mainLayoutPanel.Children.Add(anchorablePane); } anchorablePane.Children.Add(anchorableToImport); } LayoutUpdateStrategy?.AfterInsertAnchorable(Layout, anchorableToImport); var root = anchorableToImport.Root; if (root != null && Equals(root.Manager, this)) { CreateAnchorableLayoutItem(anchorableToImport); } } _suspendLayoutItemCreation = false; } } if (e.Action == NotifyCollectionChangedAction.Reset) { //NOTE: I'm going to clear every anchorable present in layout but //some anchorable may have been added directly to the layout, for now I clear them too var anchorablesToRemove = Layout.Descendents().OfType<LayoutAnchorable>().ToArray(); foreach (var anchorableToRemove in anchorablesToRemove) { anchorableToRemove.Parent.RemoveChild( anchorableToRemove); } } Layout?.CollectGarbage(); }
internal void _ExecuteHideCommand(LayoutAnchorable anchorable) { var model = anchorable; //by default hide the anchorable model?.Hide(); }
internal void _ExecuteDockCommand(LayoutAnchorable anchorable) { anchorable.Dock(); }
internal void _ExecuteCloseCommand(LayoutAnchorable anchorable) { var model = anchorable; if (model == null || !model.TestCanClose()) return; if (model.IsAutoHidden) model.ToggleAutoHide(); model.Close(); }