Index: Core/Common/src/Core.Common.Gui/Forms/MainWindow/MainWindow.xaml.cs =================================================================== diff -u -r065af7e201b59ec19a17c42e9d772f5e86b31338 -rbbcc23e04501f8ab12671031237c756db37b6413 --- Core/Common/src/Core.Common.Gui/Forms/MainWindow/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision 065af7e201b59ec19a17c42e9d772f5e86b31338) +++ Core/Common/src/Core.Common.Gui/Forms/MainWindow/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision bbcc23e04501f8ab12671031237c756db37b6413) @@ -438,95 +438,131 @@ private void UpdateRibbonExtensions(IPluginsHost pluginsHost) { // get all ribbon controls - ribbonCommandHandlers = pluginsHost.Plugins.Where(p => p.RibbonCommandHandler != null).Select(p => p.RibbonCommandHandler).ToArray(); + ribbonCommandHandlers = pluginsHost.Plugins.Where(p => p.RibbonCommandHandler != null) + .Select(p => p.RibbonCommandHandler) + .ToArray(); - foreach (var ribbonControl in ribbonCommandHandlers.Select(rch => rch.GetRibbonControl())) + foreach (Ribbon ribbonControl in ribbonCommandHandlers.Select(rch => rch.GetRibbonControl())) { - // fill contextual groups from plugins - foreach (var group in ribbonControl.ContextualGroups.Where(group => Ribbon.ContextualGroups.All(g => g.Name != group.Name))) + FillContextualGroupsFromRibbonComponent(ribbonControl); + + FillRibbonTabsFromRibbonComponent(ribbonControl); + } + } + + private void FillContextualGroupsFromRibbonComponent(Ribbon ribbonControl) + { + foreach (var group in ribbonControl.ContextualGroups.Where(group => Ribbon.ContextualGroups.All(g => g.Name != @group.Name))) + { + Ribbon.ContextualGroups.Add(@group); + } + } + + private void FillRibbonTabsFromRibbonComponent(Ribbon ribbonControl) + { + foreach (var sourceTab in ribbonControl.Tabs) + { + var existingTab = Ribbon.Tabs.FirstOrDefault(t => t.Header.Equals(sourceTab.Header)); + if (existingTab == null) // add new tab { - Ribbon.ContextualGroups.Add(group); + Ribbon.Tabs.Add(sourceTab); + existingTab = sourceTab; } - - // fill tabs from plugins - foreach (var tab in ribbonControl.Tabs) + else { - var existingTab = Ribbon.Tabs.FirstOrDefault(t => t.Header.Equals(tab.Header)); + SetReduceOrder(existingTab, sourceTab); - if (existingTab == null) // add new tab - { - Ribbon.Tabs.Add(tab); - existingTab = tab; - } - else - { - if (!string.IsNullOrEmpty(tab.ReduceOrder)) - { - existingTab.ReduceOrder += "," + tab.ReduceOrder; // Naive implementation; Can cause duplicates to occur - } + CopyRibbonGroupBoxes(existingTab, sourceTab); + } - foreach (var group in tab.Groups) - { - var existingGroup = existingTab.Groups.FirstOrDefault(g => g.Header.Equals(group.Header)); + UpdateContextualTabBindings(existingTab); + } + } - if (existingGroup == null) // add new group - { - var newGroup = new RibbonGroupBox - { - Header = group.Header, - Name = group.Name // Ensure ReduceOrder is working properly - }; + private static void SetReduceOrder(RibbonTabItem targetTab, RibbonTabItem sourceTab) + { + if (!string.IsNullOrEmpty(sourceTab.ReduceOrder)) + { + targetTab.ReduceOrder += "," + sourceTab.ReduceOrder; // Naive implementation; Can cause duplicates to occur + } + } - // Set KeyTip for keyboard navigation: - var keys = KeyTip.GetKeys(group); - if (!string.IsNullOrEmpty(keys)) - { - KeyTip.SetKeys(newGroup, keys); - } + private static void CopyRibbonGroupBoxes(RibbonTabItem targetTab, RibbonTabItem sourceTab) + { + foreach (RibbonGroupBox sourceGroup in sourceTab.Groups) + { + var existingGroup = targetTab.Groups.FirstOrDefault(g => g.Header.Equals(sourceGroup.Header)); + if (existingGroup == null) // add new group + { + RibbonGroupBox newGroup = CreateRibbonGroupBox(sourceGroup); + targetTab.Groups.Add(newGroup); + existingGroup = newGroup; + } - existingTab.Groups.Add(newGroup); - existingGroup = newGroup; - } + InitializeRibbonGroupBoxIcon(existingGroup, sourceGroup.Icon); - // Set group icon if not yet set: - if (existingGroup.Icon == null && group.Icon != null) - { - existingGroup.Icon = group.Icon; - } + CopyGroupBoxItems(existingGroup, sourceGroup); + } + } - foreach (var item in group.Items.Cast().ToArray()) - { - // HACK: remember and restore button size (looks like a bug in Fluent) - var iconSize = RibbonControlSize.Small; - var buttonItem = item as Button; - if (buttonItem != null) - { - var button = buttonItem; - iconSize = button.Size; - } + private static RibbonGroupBox CreateRibbonGroupBox(RibbonGroupBox sourceGroup) + { + var newGroup = new RibbonGroupBox + { + Header = sourceGroup.Header, + Name = sourceGroup.Name // Ensure ReduceOrder is working properly + }; - group.Items.Remove(item); - existingGroup.Items.Add(item); + // Set KeyTip for keyboard navigation: + string keys = KeyTip.GetKeys(sourceGroup); + if (!string.IsNullOrEmpty(keys)) + { + KeyTip.SetKeys(newGroup, keys); + } + return newGroup; + } - if (item is Button) - { - var button = existingGroup.Items.OfType