
7 changed files with 317 additions and 234 deletions
-
7ILSpy/AboutPage.cs
-
57ILSpy/Controls/MainMenu.xaml
-
115ILSpy/Controls/MainMenu.xaml.cs
-
87ILSpy/Controls/MainToolBar.xaml
-
136ILSpy/Controls/MainToolBar.xaml.cs
-
122ILSpy/MainWindow.xaml
-
27ILSpy/MainWindow.xaml.cs
@ -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 @@ |
|||
<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 @@ |
|||
// 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; |
|||
} |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue