Skip to content

Commit

Permalink
Merge pull request #68094 from sharwell/fix-toolbar
Browse files Browse the repository at this point in the history
Use a proper tool bar in Document Outline
  • Loading branch information
sharwell authored May 15, 2023
2 parents d0a38b1 + b54a0d1 commit c8277ce
Show file tree
Hide file tree
Showing 36 changed files with 1,736 additions and 440 deletions.
86 changes: 86 additions & 0 deletions src/VisualStudio/Core/Def/Commands.vsct
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@
</Group>

<Group guid="guidStackTraceExplorer" id="StackTraceExplorerContextMenuGrp" />

<Group guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbarGroup" priority="0x0100">
<Parent guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbar" />
</Group>
</Groups>

<Buttons>
Expand Down Expand Up @@ -533,6 +537,71 @@
<LocCanonicalName>ClearStackTraceExplorer</LocCanonicalName>
</Strings>
</Button>

<Button guid="guidRoslynGrpId" id="cmdidDocumentOutlineExpandAll" priority="0x0101" type="Button">
<Parent guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbarGroup" />
<Icon guid="ImageCatalogGuid" id="ExpandAll" />
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>IconIsMoniker</CommandFlag>
<Strings>
<LocCanonicalName>DocumentOutlineExpandAll</LocCanonicalName>
<ButtonText>Expand All</ButtonText>
<MenuText>Expand All</MenuText>
<ToolTipText>Expand All</ToolTipText>
</Strings>
</Button>

<Button guid="guidRoslynGrpId" id="cmdidDocumentOutlineCollapseAll" priority="0x0102" type="Button">
<Parent guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbarGroup" />
<Icon guid="ImageCatalogGuid" id="CollapseAll" />
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>IconIsMoniker</CommandFlag>
<Strings>
<LocCanonicalName>DocumentOutlineCollapseAll</LocCanonicalName>
<ButtonText>Collapse All</ButtonText>
<MenuText>Collapse All</MenuText>
<ToolTipText>Collapse All</ToolTipText>
</Strings>
</Button>

<Button guid="guidRoslynGrpId" id="cmdidDocumentOutlineSortByName" priority="0x0103" type="Button">
<Parent guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbarGroup" />
<Icon guid="ImageCatalogGuid" id="SortAscending" />
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>IconIsMoniker</CommandFlag>
<Strings>
<LocCanonicalName>DocumentOutlineSortByName</LocCanonicalName>
<ButtonText>Sort By Name</ButtonText>
<MenuText>Sort By Name</MenuText>
<ToolTipText>Sort By Name</ToolTipText>
</Strings>
</Button>

<Button guid="guidRoslynGrpId" id="cmdidDocumentOutlineSortByOrder" priority="0x0104" type="Button">
<Parent guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbarGroup" />
<Icon guid="ImageCatalogGuid" id="SortByNamespace" />
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>IconIsMoniker</CommandFlag>
<Strings>
<LocCanonicalName>DocumentOutlineSortByOrder</LocCanonicalName>
<ButtonText>Sort By Order</ButtonText>
<MenuText>Sort By Order</MenuText>
<ToolTipText>Sort By Order</ToolTipText>
</Strings>
</Button>

<Button guid="guidRoslynGrpId" id="cmdidDocumentOutlineSortByType" priority="0x0105" type="Button">
<Parent guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbarGroup" />
<Icon guid="ImageCatalogGuid" id="SortByType" />
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>IconIsMoniker</CommandFlag>
<Strings>
<LocCanonicalName>DocumentOutlineSortByType</LocCanonicalName>
<ButtonText>Sort By Type</ButtonText>
<MenuText>Sort By Type</MenuText>
<ToolTipText>Sort By Type</ToolTipText>
</Strings>
</Button>
</Buttons>

<Menus>
Expand Down Expand Up @@ -618,6 +687,15 @@
<ButtonText>StackTrace Explorer</ButtonText>
</Strings>
</Menu>

<!-- Document Outline toolbar -->
<Menu guid="guidRoslynGrpId" id="cmdidDocumentOutlineToolbar" type="Toolbar">
<CommandFlag>NotInTBList</CommandFlag>
<Strings>
<LocCanonicalName>RoslynDocumentOutlineToolbar</LocCanonicalName>
<ButtonText>Document Outline</ButtonText>
</Strings>
</Menu>
</Menus>
</Commands>

Expand Down Expand Up @@ -780,6 +858,14 @@
<IDSymbol name="cmdidshowValueTracking" value="0x0203" />

<IDSymbol name="cmdidSyncNamespaces" value="0x204" />

<IDSymbol name="cmdidDocumentOutlineToolbar" value="0x300" />
<IDSymbol name="cmdidDocumentOutlineExpandAll" value="0x311"/>
<IDSymbol name="cmdidDocumentOutlineCollapseAll" value="0x312"/>
<IDSymbol name="cmdidDocumentOutlineSortByName" value="0x313"/>
<IDSymbol name="cmdidDocumentOutlineSortByOrder" value="0x314"/>
<IDSymbol name="cmdidDocumentOutlineSortByType" value="0x315"/>
<IDSymbol name="cmdidDocumentOutlineToolbarGroup" value="0x350" />
</GuidSymbol>

<GuidSymbol name="guidEditorCommands" value="{160961B3-909D-4B28-9353-A1BEF587B4A6}">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,7 @@ namespace Microsoft.VisualStudio.LanguageServices.DocumentOutline
internal sealed class DocumentOutlineOptionsStorage
{
public static readonly Option2<bool> EnableDocumentOutline = new("visual_studio_enable_document_outline", defaultValue: false);

public static readonly Option2<SortOption> DocumentOutlineSortOrder = new("visual_studio_document_outline_sort_order", defaultValue: SortOption.Location);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,7 @@ namespace Microsoft.VisualStudio.LanguageServices.DocumentOutline
{
internal static class DocumentOutlineStrings
{
public static string Document_Outline_Search
=> ServicesVSResources.Document_Outline_Search;

public static string Document_Outline_Expand_All
=> ServicesVSResources.Document_Outline_Expand_All;

public static string Document_Outline_Collapse_All
=> ServicesVSResources.Document_Outline_Collapse_All;

public static string Document_Outline_Sort_Name
=> ServicesVSResources.Document_Outline_Sort_Name;

public static string Document_Outline_Sort_Order
=> ServicesVSResources.Document_Outline_Sort_Order;

public static string Document_Outline_Sort_Type
=> ServicesVSResources.Document_Outline_Sort_Type;
public static string Document_Outline
=> ServicesVSResources.Document_Outline;
}
}
62 changes: 8 additions & 54 deletions src/VisualStudio/Core/Def/DocumentOutline/DocumentOutlineView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,61 +72,12 @@
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="23" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="28" />
<ColumnDefinition Width="28" />
<ColumnDefinition Width="28" />
<ColumnDefinition Width="28" />
<ColumnDefinition Width="28" />
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Click="ExpandAll" ToolTip="{x:Static self:DocumentOutlineStrings.Document_Outline_Expand_All}">
<imaging:CrispImage Moniker="{x:Static imagecatalog:KnownMonikers.ExpandAll}" />
</Button>
<Button Grid.Column="1" Click="CollapseAll" ToolTip="{x:Static self:DocumentOutlineStrings.Document_Outline_Collapse_All}">
<imaging:CrispImage Moniker="{x:Static imagecatalog:KnownMonikers.CollapseAll}" />
</Button>
<Button Grid.Column="2" Click="SortByName" ToolTip="{x:Static self:DocumentOutlineStrings.Document_Outline_Sort_Name}">
<imaging:CrispImage Moniker="{x:Static imagecatalog:KnownMonikers.SortAscending}" />
</Button>
<Button Grid.Column="3" Click="SortByOrder" ToolTip="{x:Static self:DocumentOutlineStrings.Document_Outline_Sort_Order}">
<imaging:CrispImage Moniker="{x:Static imagecatalog:KnownMonikers.SortByNamespace}" />
</Button>
<Button Grid.Column="4" Click="SortByType" ToolTip="{x:Static self:DocumentOutlineStrings.Document_Outline_Sort_Type}">
<imaging:CrispImage Moniker="{x:Static imagecatalog:KnownMonikers.SortByType}" />
</Button>
</Grid>
<TextBox Grid.Row="1" x:Name="SearchBox" TextChanged="SearchBox_TextChanged" VerticalContentAlignment="Center">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Background" Value="{StaticResource {x:Static vsshell:VsBrushes.ToolWindowBackgroundKey}}" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static vsshell:VsBrushes.ToolWindowTextKey}}" />
<Setter Property="Padding" Value="3, 0, 0, 0" />
<Setter Property="FontFamily" Value="{StaticResource {x:Static vsshell:VsFonts.CaptionFontFamilyKey}}" />
<Setter Property="FontSize" Value="{StaticResource {x:Static vsshell:VsFonts.CaptionFontSizeKey}}" />
<Setter Property="CaretBrush" Value="{StaticResource {x:Static vsui:HeaderColors.DefaultTextBrushKey}}" />
<Style.Resources>
<VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
<VisualBrush.Visual>
<Label Content="{x:Static self:DocumentOutlineStrings.Document_Outline_Search}"
Foreground="{DynamicResource {x:Static vsshell:VsBrushes.TitleBarInactiveTextKey}}"
FontFamily="{StaticResource {x:Static vsshell:VsFonts.CaptionFontFamilyKey}}"
FontSize="{StaticResource {x:Static vsshell:VsFonts.CaptionFontSizeKey}}" />
</VisualBrush.Visual>
</VisualBrush>
</Style.Resources>
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<ContentControl Grid.Row="0" Name="Commands" Focusable="True" />
<Grid Grid.Row="1" x:Name="SearchHost" />
<!-- Two important properties are being set for TreeView:
We set IsVirtualizing to "True" so that WPF only generates internal data-structures elements that are visible.
Setting VirtualizationMode to "Recycling" ensures that WPF internal data is reused as items scroll in and out of view.
Expand All @@ -140,16 +91,18 @@
interaction. -->
<TreeView Grid.Row="2"
Name="SymbolTree"
AutomationProperties.Name="{x:Static self:DocumentOutlineStrings.Document_Outline}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
TreeViewItem.SourceUpdated="SymbolTreeItem_SourceUpdated"
TreeViewItem.Selected="SymbolTreeItem_Selected"
ItemsSource="{Binding Source={StaticResource DocumentSymbolItems}}"> <!-- Binding to our CollectionViewSource -->
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type self:DocumentSymbolDataViewModel}">
<HierarchicalDataTemplate.ItemsSource>
<MultiBinding Converter="{StaticResource ItemSorter}"> <!-- This binding ensures our TreeViewItems are sorted if the collection is changed OR the sort option is changed -->
<Binding Path="Children" />
<Binding Path="DataContext.SortOption" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=UserControl}" />
<Binding Path="DataContext.SortOption" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=UserControl}" />
</MultiBinding>
</HierarchicalDataTemplate.ItemsSource>
<StackPanel Orientation="Horizontal"
Expand All @@ -170,6 +123,7 @@
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Static vsshell:VsResourceKeys.ThemedDialogTreeViewItemStyleKey}}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="AutomationProperties.Name" Value="{Binding Data.Name, Mode=OneWay}" />
<!-- See docs above for why we set `NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=False` -->
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=False}" />
<Setter Property="Padding" Value="4, 0, 6, 1" />
Expand Down
Loading

0 comments on commit c8277ce

Please sign in to comment.