mirror of https://github.com/icsharpcode/ILSpy.git
10 changed files with 393 additions and 236 deletions
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
<Project> |
||||
<PropertyGroup> |
||||
<WarningsAsErrors>IDE2000</WarningsAsErrors> |
||||
</PropertyGroup> |
||||
</Project> |
@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
|
||||
<UserControl x:Class="ICSharpCode.ILSpy.Controls.MainMenu" |
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
||||
xmlns:local="clr-namespace:ICSharpCode.ILSpy.Controls" |
||||
xmlns:properties="clr-namespace:ICSharpCode.ILSpy.Properties" |
||||
xmlns:themes="clr-namespace:ICSharpCode.ILSpy.Themes" |
||||
xmlns:composition="urn:TomsToolbox.Composition" |
||||
xmlns:toms="urn:TomsToolbox" |
||||
xmlns:commands="clr-namespace:ICSharpCode.ILSpy.Commands" |
||||
mc:Ignorable="d" d:DesignWidth="800" DataContext="{Binding RelativeSource={RelativeSource Self}}"> |
||||
<Menu DockPanel.Dock="Top" Name="Menu" Height="23" KeyboardNavigation.TabNavigation="None"> |
||||
<MenuItem Header="{x:Static properties:Resources._File}" Tag="_File"> |
||||
<!-- content of file menu is added using MEF --> |
||||
</MenuItem> |
||||
<MenuItem Header="{x:Static properties:Resources._View}" Tag="_View"> |
||||
<MenuItem Header="{x:Static properties:Resources.Show_publiconlyTypesMembers}" IsCheckable="True" |
||||
IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicOnly}" /> |
||||
<MenuItem Header="{x:Static properties:Resources.Show_internalTypesMembers}" IsCheckable="True" |
||||
IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicAndInternal}" /> |
||||
<MenuItem Header="{x:Static properties:Resources.Show_allTypesAndMembers}" IsCheckable="True" |
||||
IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisAll}" /> |
||||
<Separator /> |
||||
<MenuItem Header="{x:Static properties:Resources.Theme}" ItemsSource="{x:Static themes:ThemeManager.AllThemes}"> |
||||
<MenuItem.ItemContainerStyle> |
||||
<Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}"> |
||||
<Setter Property="Command" Value="{composition:Import commands:SetThemeCommand}" /> |
||||
<Setter Property="CommandParameter" Value="{Binding}" /> |
||||
<Setter Property="IsCheckable" Value="True" /> |
||||
<!-- Required by AvalonDock's MenuItem style to show the checkmark --> |
||||
<Setter Property="IsChecked"> |
||||
<Setter.Value> |
||||
<MultiBinding Converter="{x:Static toms:BinaryOperationConverter.Equality}" Mode="OneWay"> |
||||
<Binding /> |
||||
<Binding Path="SessionSettings.Theme" |
||||
RelativeSource="{RelativeSource FindAncestor, AncestorType=UserControl}" /> |
||||
</MultiBinding> |
||||
</Setter.Value> |
||||
</Setter> |
||||
</Style> |
||||
</MenuItem.ItemContainerStyle> |
||||
</MenuItem> |
||||
<MenuItem Header="{x:Static properties:Resources.UILanguage}"> |
||||
<MenuItem Header="{x:Static properties:Resources.UILanguage_System}" IsCheckable="True" |
||||
IsChecked="{Binding SessionSettings.CurrentCulture, Converter={local:CultureSelectionConverter}, ConverterParameter={x:Null}}" /> |
||||
<MenuItem Header="English" IsCheckable="True" |
||||
IsChecked="{Binding SessionSettings.CurrentCulture, Converter={local:CultureSelectionConverter}, ConverterParameter=en-US}" /> |
||||
<MenuItem Header="中文" IsCheckable="True" |
||||
IsChecked="{Binding SessionSettings.CurrentCulture, Converter={local:CultureSelectionConverter}, ConverterParameter=zh-Hans}" /> |
||||
</MenuItem> |
||||
</MenuItem> |
||||
<MenuItem x:Name="WindowMenuItem" Header="{x:Static properties:Resources._Window}" Tag="_Window"> |
||||
<!-- content of window menu is added using MEF --> |
||||
</MenuItem> |
||||
</Menu> |
||||
</UserControl> |
@ -0,0 +1,87 @@
@@ -0,0 +1,87 @@
|
||||
<UserControl x:Class="ICSharpCode.ILSpy.Controls.MainToolBar" |
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
||||
xmlns:toms="urn:TomsToolbox" |
||||
xmlns:properties="clr-namespace:ICSharpCode.ILSpy.Properties" |
||||
xmlns:controls="clr-namespace:ICSharpCode.ILSpy.Controls" |
||||
xmlns:themes="clr-namespace:ICSharpCode.ILSpy.Themes" |
||||
xmlns:composition="urn:TomsToolbox.Composition" |
||||
xmlns:ilSpy="clr-namespace:ICSharpCode.ILSpy" |
||||
mc:Ignorable="d" d:DesignWidth="800"> |
||||
<ToolBar Name="ToolBar" |
||||
DockPanel.Dock="Top" ToolBarTray.IsLocked="True" KeyboardNavigation.TabNavigation="None"> |
||||
<ToolBar.Resources> |
||||
<!-- Make images transparent if menu command is disabled --> |
||||
<Style TargetType="{x:Type Image}"> |
||||
<Style.Triggers> |
||||
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ButtonBase}, AncestorLevel=1}, Path=IsEnabled}" Value="False"> |
||||
<Setter Property="Opacity" Value="0.30" /> |
||||
</DataTrigger> |
||||
</Style.Triggers> |
||||
</Style> |
||||
<Style TargetType="{x:Type Image}" x:Key="DarkModeAwareImageStyle"> |
||||
<Setter Property="Effect" Value="{DynamicResource {x:Static themes:ResourceKeys.ThemeAwareButtonEffect}}" /> |
||||
<Style.Triggers> |
||||
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ButtonBase}, AncestorLevel=1}, Path=IsEnabled}" Value="False"> |
||||
<Setter Property="Opacity" Value="0.30" /> |
||||
</DataTrigger> |
||||
</Style.Triggers> |
||||
</Style> |
||||
</ToolBar.Resources> |
||||
<!-- 'Navigation' toolbar category is inserted here --> |
||||
<Separator /> |
||||
<!-- 'Open' toolbar category is inserted here --> |
||||
<Separator /> |
||||
<Grid Margin="2,0"> |
||||
<ItemsControl ItemsSource="{Binding AssemblyListManager.AssemblyLists}" Height="0" Margin="15,0" /> |
||||
<ComboBox Name="assemblyListComboBox" MaxDropDownHeight="Auto" |
||||
ItemsSource="{Binding AssemblyListManager.AssemblyLists}" |
||||
ToolTip="{x:Static properties:Resources.SelectAssemblyListDropdownTooltip}" |
||||
SelectedItem="{Binding SessionSettings.ActiveAssemblyList}" /> |
||||
</Grid> |
||||
<Button Command="{composition:Import ilSpy:ManageAssemblyListsCommand}" |
||||
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" |
||||
ToolTip="{x:Static properties:Resources.ManageAssemblyLists}"> |
||||
<Image Width="16" Height="16" Source="{controls:XamlResource Images/AssemblyList}" |
||||
Style="{StaticResource DarkModeAwareImageStyle}" /> |
||||
</Button> |
||||
<Separator /> |
||||
<CheckBox IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicOnly}" |
||||
ToolTip="{x:Static properties:Resources.ShowPublicOnlyTypesMembers}"> |
||||
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPublicOnly}" |
||||
Style="{StaticResource DarkModeAwareImageStyle}" /> |
||||
</CheckBox> |
||||
<CheckBox IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisPublicAndInternal}" |
||||
ToolTip="{x:Static properties:Resources.ShowInternalTypesMembers}"> |
||||
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowPrivateInternal}" |
||||
Style="{StaticResource DarkModeAwareImageStyle}" /> |
||||
</CheckBox> |
||||
<CheckBox IsChecked="{Binding SessionSettings.LanguageSettings.ApiVisAll}" |
||||
ToolTip="{x:Static properties:Resources.ShowAllTypesAndMembers}"> |
||||
<Image Width="16" Height="16" Source="{controls:XamlResource Images/ShowAll}" |
||||
Style="{StaticResource DarkModeAwareImageStyle}" /> |
||||
</CheckBox> |
||||
<Separator /> |
||||
<Grid Margin="2,0"> |
||||
<ItemsControl ItemsSource="{Binding LanguageService.AllLanguages}" DisplayMemberPath="Name" Height="0" Margin="15,0" /> |
||||
<ComboBox Name="languageComboBox" DisplayMemberPath="Name" MaxDropDownHeight="Auto" |
||||
IsEnabled="{Binding Workspace.ActiveTabPage.SupportsLanguageSwitching}" |
||||
ItemsSource="{Binding LanguageService.AllLanguages}" |
||||
ToolTip="{x:Static properties:Resources.SelectLanguageDropdownTooltip}" |
||||
SelectedItem="{Binding LanguageService.Language}" /> |
||||
</Grid> |
||||
<Grid Margin="2,0"> |
||||
<ItemsControl |
||||
ItemsSource="{Binding SelectedItem.LanguageVersions, ElementName=languageComboBox, UpdateSourceTrigger=PropertyChanged}" |
||||
DisplayMemberPath="DisplayName" Height="0" Margin="15,0" /> |
||||
<ComboBox Name="languageVersionComboBox" DisplayMemberPath="DisplayName" MaxDropDownHeight="Auto" |
||||
ToolTip="{x:Static properties:Resources.SelectVersionDropdownTooltip}" |
||||
Visibility="{Binding SelectedItem.HasLanguageVersions, ElementName=languageComboBox, Converter={toms:BooleanToVisibilityConverter}}" |
||||
IsEnabled="{Binding Workspace.ActiveTabPage.SupportsLanguageSwitching}" |
||||
ItemsSource="{Binding SelectedItem.LanguageVersions, ElementName=languageComboBox, UpdateSourceTrigger=PropertyChanged}" |
||||
SelectedItem="{Binding LanguageService.LanguageVersion, UpdateSourceTrigger=PropertyChanged}" /> |
||||
</Grid> |
||||
</ToolBar> |
||||
</UserControl> |
@ -0,0 +1,136 @@
@@ -0,0 +1,136 @@
|
||||
// Copyright (c) 2024 Tom Englert for the SharpDevelop Team
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
// software and associated documentation files (the "Software"), to deal in the Software
|
||||
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or
|
||||
// substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
using System.Composition; |
||||
using System.Linq; |
||||
using System.Windows; |
||||
using System.Windows.Controls; |
||||
using System.Windows.Controls.Primitives; |
||||
using System.Windows.Data; |
||||
using System.Windows.Input; |
||||
using System.Windows.Threading; |
||||
|
||||
using ICSharpCode.ILSpy.Themes; |
||||
|
||||
using TomsToolbox.Composition; |
||||
|
||||
namespace ICSharpCode.ILSpy.Controls |
||||
{ |
||||
/// <summary>
|
||||
/// Interaction logic for MainToolBar.xaml
|
||||
/// </summary>
|
||||
[Export] |
||||
[NonShared] |
||||
public partial class MainToolBar |
||||
{ |
||||
public MainToolBar(IExportProvider exportProvider) |
||||
{ |
||||
InitializeComponent(); |
||||
|
||||
this.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => { |
||||
InitToolbar(ToolBar, exportProvider); |
||||
Window.GetWindow(this)!.KeyDown += MainWindow_KeyDown; |
||||
}); |
||||
} |
||||
|
||||
static void InitToolbar(ToolBar toolBar, IExportProvider exportProvider) |
||||
{ |
||||
int navigationPos = 0; |
||||
int openPos = 1; |
||||
var toolbarCommandsByCategory = exportProvider |
||||
.GetExports<ICommand, IToolbarCommandMetadata>("ToolbarCommand") |
||||
.OrderBy(c => c.Metadata?.ToolbarOrder) |
||||
.GroupBy(c => c.Metadata?.ToolbarCategory); |
||||
|
||||
foreach (var commandCategory in toolbarCommandsByCategory) |
||||
{ |
||||
if (commandCategory.Key == nameof(Properties.Resources.Navigation)) |
||||
{ |
||||
foreach (var command in commandCategory) |
||||
{ |
||||
toolBar.Items.Insert(navigationPos++, CreateToolbarItem(command)); |
||||
openPos++; |
||||
} |
||||
} |
||||
else if (commandCategory.Key == nameof(Properties.Resources.Open)) |
||||
{ |
||||
foreach (var command in commandCategory) |
||||
{ |
||||
toolBar.Items.Insert(openPos++, CreateToolbarItem(command)); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
toolBar.Items.Add(new Separator()); |
||||
foreach (var command in commandCategory) |
||||
{ |
||||
toolBar.Items.Add(CreateToolbarItem(command)); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
static Button CreateToolbarItem(IExport<ICommand, IToolbarCommandMetadata> commandExport) |
||||
{ |
||||
var command = commandExport.Value; |
||||
|
||||
Button toolbarItem = new() { |
||||
Style = ThemeManager.Current.CreateToolBarButtonStyle(), |
||||
Command = CommandWrapper.Unwrap(command), |
||||
ToolTip = Properties.Resources.ResourceManager.GetString( |
||||
commandExport.Metadata?.ToolTip ?? string.Empty), |
||||
Tag = commandExport.Metadata?.Tag, |
||||
Content = new Image { |
||||
Width = 16, |
||||
Height = 16, |
||||
Source = Images.Load(command, commandExport.Metadata?.ToolbarIcon) |
||||
} |
||||
}; |
||||
|
||||
if (command is IProvideParameterBinding parameterBinding) |
||||
{ |
||||
BindingOperations.SetBinding(toolbarItem, ButtonBase.CommandParameterProperty, |
||||
parameterBinding.ParameterBinding); |
||||
} |
||||
|
||||
return toolbarItem; |
||||
} |
||||
|
||||
void MainWindow_KeyDown(object sender, KeyEventArgs e) |
||||
{ |
||||
if (e.Handled || e.KeyboardDevice.Modifiers != ModifierKeys.Alt || e.Key != Key.System) |
||||
return; |
||||
|
||||
switch (e.SystemKey) |
||||
{ |
||||
case Key.A: |
||||
assemblyListComboBox.Focus(); |
||||
e.Handled = true; |
||||
break; |
||||
case Key.L: |
||||
languageComboBox.Focus(); |
||||
e.Handled = true; |
||||
break; |
||||
case Key.E: // Alt+V was already taken by _View menu
|
||||
languageVersionComboBox.Focus(); |
||||
e.Handled = true; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue