private static void SetIsEnabledProperty(FrameworkElement ribbonButton, IMainWindowButton mainWindowButton)
 {
     ribbonButton.SetBinding(UIElement.IsEnabledProperty, new System.Windows.Data.Binding("SelectedItem")
     {
         Converter   = new CustomConverter(mainWindowButton),
         ElementName = "InstanceList"
     });
 }
Example #2
0
        private static RoutedEventHandler GetClickHandler(IMainWindowButton mainWindowButton)
        {
            var clickHandler = new RoutedEventHandler(delegate
            {
                try
                {
                    if (mainWindowButton != null && mainWindowButton.IsEnabled(MainWindow.Instance, SelectedInstance))
                    {
                        mainWindowButton.OnClick(MainWindow.Instance, SelectedInstance);
                    }
                }
                catch (Exception ex)
                {
                    WindowHelper.HandleError("Failed to get click handler", true, ex);
                }
            });

            return(clickHandler);
        }
        private static RoutedEventHandler GetClickHandler(IMainWindowButton mainWindowButton)
        {
            var clickHandler = new RoutedEventHandler(delegate
            {
                try
                {
                    if (mainWindowButton != null && mainWindowButton.IsEnabled(MainWindow.Instance, SelectedInstance))
                    {
                        mainWindowButton.OnClick(MainWindow.Instance, SelectedInstance);
                        MainWindowHelper.RefreshInstances();
                    }
                }
                catch (Exception ex)
                {
                    WindowHelper.HandleError(ex.Message, true);
                }
            });

            return(clickHandler);
        }
        private static FrameworkElement GetRibbonButton(MainWindow window, Func <string, ImageSource> getImage, ButtonDefinition button, RibbonGroupBox ribbonGroup, IMainWindowButton mainWindowButton)
        {
            Assert.ArgumentNotNull(button, nameof(button));
            Assert.ArgumentNotNull(ribbonGroup, nameof(ribbonGroup));

            var header = button.Label;

            var clickHandler = GetClickHandler(mainWindowButton);

            if (button.Buttons == null || button.Buttons.Length == 0 || button.Buttons.All(x => x == null))
            {
                // create Ribbon Button
                var imageSource  = getImage(button.Image);
                var fluentButton = new Fluent.Button
                {
                    Icon      = imageSource,
                    LargeIcon = imageSource,
                    Header    = header
                };
                fluentButton.Click += clickHandler;
                ribbonGroup.Items.Add(fluentButton);
                return(fluentButton);
            }

            // create Ribbon Button
            var splitButton = ribbonGroup.Items.OfType <SplitButton>().SingleOrDefault(x => x.Header.ToString().Trim().EqualsIgnoreCase(header.Trim()));

            if (splitButton == null)
            {
                var imageSource = getImage(button.Image);
                splitButton = new Fluent.SplitButton
                {
                    Icon      = imageSource,
                    LargeIcon = imageSource,
                    Header    = header
                };

                if (mainWindowButton != null)
                {
                    splitButton.Click += clickHandler;
                }
                else
                {
                    var childrenButtons = new List <KeyValuePair <string, IMainWindowButton> >();
                    splitButton.Tag    = childrenButtons;
                    splitButton.Click += (sender, args) => splitButton.IsDropDownOpen = true;
                }

                ribbonGroup.Items.Add(splitButton);
            }

            var items = splitButton.Items;

            Assert.IsNotNull(items, nameof(items));

            foreach (var menuItem in button.Buttons)
            {
                if (menuItem == null)
                {
                    continue;
                }

                try
                {
                    var menuHeader = menuItem.Label;
                    if (string.IsNullOrEmpty(menuHeader))
                    {
                        items.Add(new Separator());
                        continue;
                    }

                    var largeImage  = menuItem.Image;
                    var menuIcon    = string.IsNullOrEmpty(largeImage) ? null : getImage(largeImage);
                    var menuHandler = menuItem.Handler;

                    var childrenButtons = splitButton.Tag as ICollection <KeyValuePair <string, IMainWindowButton> >;
                    if (childrenButtons != null)
                    {
                        childrenButtons.Add(new KeyValuePair <string, IMainWindowButton>(menuHeader, menuHandler));
                    }

                    var menuButton = new Fluent.MenuItem()
                    {
                        Header    = menuHeader,
                        IsEnabled = menuHandler?.IsEnabled(window, SelectedInstance) ?? true
                    };

                    if (menuIcon != null)
                    {
                        menuButton.Icon = menuIcon;
                    }

                    if (menuHandler != null)
                    {
                        // bind IsEnabled event
                        SetIsEnabledProperty(menuButton, menuHandler);

                        menuButton.Click += delegate
                        {
                            try
                            {
                                if (menuHandler.IsEnabled(MainWindow.Instance, SelectedInstance))
                                {
                                    menuHandler.OnClick(MainWindow.Instance, SelectedInstance);
                                    RefreshInstances();
                                }
                            }
                            catch (Exception ex)
                            {
                                WindowHelper.HandleError($"Error during handling menu button click: {menuHandler.GetType().FullName}", true, ex);
                            }
                        };
                    }

                    items.Add(menuButton);
                }
                catch (Exception ex)
                {
                    WindowHelper.HandleError($"Error during initializing ribbon button: {menuItem.Label}", true, ex);
                }
            }

            return(splitButton);
        }
        public CustomConverter([NotNull] IMainWindowButton mainWindowButton)
        {
            Assert.ArgumentNotNull(mainWindowButton, "mainWindowButton");

            this.button = mainWindowButton;
        }
        public CustomConverter([NotNull] IMainWindowButton mainWindowButton)
        {
            Assert.ArgumentNotNull(mainWindowButton, "mainWindowButton");

              this.button = mainWindowButton;
        }
        private static FrameworkElement GetRibbonButton(MainWindow window, Func <string, ImageSource> getImage, XmlElement button, RibbonGroupBox ribbonGroup, IMainWindowButton mainWindowButton)
        {
            var header = button.GetNonEmptyAttribute("label");

            var clickHandler = GetClickHandler(mainWindowButton);

            if (button.ChildNodes.Count == 0)
            {
                // create Ribbon Button
                var imageSource  = getImage(button.GetNonEmptyAttribute("largeImage"));
                var fluentButton = new Fluent.Button
                {
                    Icon      = imageSource,
                    LargeIcon = imageSource,
                    Header    = header
                };
                fluentButton.Click += clickHandler;
                ribbonGroup.Items.Add(fluentButton);
                return(fluentButton);
            }

            // create Ribbon Button
            var splitButton = ribbonGroup.Items.OfType <SplitButton>().SingleOrDefault(x => Extensions.EqualsIgnoreCase(x.Header.ToString().Trim(), header.Trim()));

            if (splitButton == null)
            {
                var imageSource = getImage(button.GetNonEmptyAttribute("largeImage"));
                splitButton = new Fluent.SplitButton
                {
                    Icon      = imageSource,
                    LargeIcon = imageSource,
                    Header    = header
                };

                if (mainWindowButton != null)
                {
                    splitButton.Click += clickHandler;
                }
                else
                {
                    var childrenButtons = new List <KeyValuePair <string, IMainWindowButton> >();
                    splitButton.Tag    = childrenButtons;
                    splitButton.Click += (sender, args) => splitButton.IsDropDownOpen = true;
                }

                ribbonGroup.Items.Add(splitButton);
            }

            var items = splitButton.Items;

            Assert.IsNotNull(items, nameof(items));

            foreach (var menuItem in button.ChildNodes.OfType <XmlElement>())
            {
                if (menuItem == null)
                {
                    continue;
                }

                try
                {
                    var name = menuItem.Name;
                    if (name.EqualsIgnoreCase("separator"))
                    {
                        items.Add(new Separator());
                        continue;
                    }

                    if (!name.EqualsIgnoreCase("button"))
                    {
                        Log.Error($"This element is not supported as SplitButton element: {menuItem.OuterXml}");
                        continue;
                    }

                    var menuHeader  = menuItem.GetAttribute("label");
                    var largeImage  = menuItem.GetAttribute("largeImage");
                    var menuIcon    = string.IsNullOrEmpty(largeImage) ? null : getImage(largeImage);
                    var menuHandler = (IMainWindowButton)Plugin.CreateInstance(menuItem);
                    Assert.IsNotNull(menuHandler, nameof(menuHandler));

                    var childrenButtons = splitButton.Tag as ICollection <KeyValuePair <string, IMainWindowButton> >;
                    if (childrenButtons != null)
                    {
                        childrenButtons.Add(new KeyValuePair <string, IMainWindowButton>(menuHeader, menuHandler));
                    }

                    var menuButton = new Fluent.MenuItem()
                    {
                        Header    = menuHeader,
                        IsEnabled = menuHandler.IsEnabled(window, SelectedInstance)
                    };

                    if (menuIcon != null)
                    {
                        menuButton.Icon = menuIcon;
                    }

                    // bind IsEnabled event
                    SetIsEnabledProperty(menuButton, menuHandler);

                    menuButton.Click += delegate
                    {
                        try
                        {
                            if (menuHandler.IsEnabled(MainWindow.Instance, SelectedInstance))
                            {
                                menuHandler.OnClick(MainWindow.Instance, SelectedInstance);
                                MainWindowHelper.RefreshInstances();
                            }
                        }
                        catch (Exception ex)
                        {
                            WindowHelper.HandleError("Error during handling menu button click: " + menuHandler.GetType().FullName, true, ex);
                        }
                    };

                    items.Add(menuButton);
                }
                catch (Exception ex)
                {
                    WindowHelper.HandleError("Error during initializing ribbon button: " + menuItem.OuterXml, true, ex);
                }
            }

            return(splitButton);
        }
        public CustomEnabledConverter([NotNull] IMainWindowButton mainWindowButton)
        {
            Assert.ArgumentNotNull(mainWindowButton, nameof(mainWindowButton));

            Button = mainWindowButton;
        }