Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use a proper tool bar in Document Outline #68094

Merged
merged 6 commits into from
May 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
}
}
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