未验证 提交 96cf79f2 编写于 作者: P Petr 提交者: GitHub

Ditch the Lens (#14261)

上级 634bf167
......@@ -42,7 +42,6 @@ Most of the syntax operations require an entire document's source text or parse
|---------|---------------|---------------|-----------------|
| Most code fixes | Current document's typecheck data | Set (1 or more) of suggested text replacements | S-M |
| Semantic classification | Current document's typecheck data | Spans of text with semantic classification type for all constructs in a document | S-L |
| Lenses | Current document's typecheck data and top-level declarations (for showing signatures); graph of all projects that reference the current one (for showing references) | Signature data for each top-level construct; spans of text for each reference to a top-level construct with navigation information | S-XL |
| Code generation / refactorings | Current document's typecheck data and/or current resolved symbol/symbols | Text replacement(s) | S-L |
| Code completion | Current document's typecheck data and currently-resolved symbol user is typing at | List of all symbols in scope that are "completable" based on where completion is invoked | S-L |
| Editor tooltips | Current document's typecheck data and resolved symbol where user invoked a tooltip | F# tooltip data based on inspecting a type and its declarations, then pretty-printing them | S-XL |
......
......@@ -81,10 +81,6 @@ module internal Guids =
/// "9A66EB6A-DE52-4169-BC26-36FBD4312FD7"
let codeFixesOptionPageIdString = "9A66EB6A-DE52-4169-BC26-36FBD4312FD7"
[<Literal>]
/// "00BE7FD9-8145-4A2E-A1BF-3BAF0F4F47DD"
let lensOptionPageIdString = "00BE7FD9-8145-4A2E-A1BF-3BAF0F4F47DD"
[<Literal>]
/// "8FDA964A-263D-4B4E-9560-29897535217C"
let languageServicePerformanceOptionPageIdString = "8FDA964A-263D-4B4E-9560-29897535217C"
......
......@@ -133,9 +133,6 @@
<Compile Include="Hints\NativeToRoslynHintConverter.fs" />
<Compile Include="Hints\OptionParser.fs" />
<Compile Include="Hints\RoslynAdapter.fs" />
<Compile Include="Lens\LensDisplayService.fs" />
<Compile Include="Lens\LensService.fs" />
<Compile Include="Lens\LensProvider.fs" />
</ItemGroup>
<ItemGroup>
......
......@@ -177,9 +177,6 @@
<data name="6012" xml:space="preserve">
<value>Advanced</value>
</data>
<data name="6013" xml:space="preserve">
<value>Lens</value>
</data>
<data name="6014" xml:space="preserve">
<value>Formatting</value>
</data>
......
......@@ -198,7 +198,6 @@ type internal FSharpSettingsFactory
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.CodeFixesOptionPage>, "F#", null, "Code Fixes", "6010")>]
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.LanguageServicePerformanceOptionPage>, "F#", null, "Performance", "6011")>]
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.AdvancedSettingsOptionPage>, "F#", null, "Advanced", "6012")>]
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.LensOptionPage>, "F#", null, "Lens", "6013")>]
[<ProvideLanguageEditorOptionPage(typeof<OptionsUI.FormattingOptionPage>, "F#", null, "Formatting", "6014")>]
[<ProvideFSharpVersionRegistration(FSharpConstants.projectPackageGuidString, "Microsoft Visual F#")>]
// 64 represents a hex number. It needs to be greater than 37 so the TextMate editor will not be chosen as higher priority.
......
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace Microsoft.VisualStudio.FSharp.Editor
open System
open System.Windows.Controls
open Microsoft.VisualStudio.FSharp.Editor.Logging
open Microsoft.VisualStudio.Text
open Microsoft.VisualStudio.Text.Editor
open Microsoft.VisualStudio.Text.Formatting
open System.Threading
open System.Windows
open System.Collections.Generic
type LensDisplayService (view : IWpfTextView, buffer : ITextBuffer) as self =
// Add buffer changed event handler
do (
buffer.Changed.Add self.HandleBufferChanged
view.LayoutChanged.Add self.HandleLayoutChanged
)
/// <summary>
/// Enqueing an unit signals to the tagger that all visible lens must be layouted again,
/// to respect single line changes.
/// </summary>
member val RelayoutRequested : Queue<_> = Queue() with get
member val WpfView = view
member val TextBuffer = buffer
/// Saves the ui context to switch context for ui related work.
member val UiContext = SynchronizationContext.Current
// Tracks the created ui elements per TrackingSpan
member val UiElements = Dictionary<_,Grid>()
member val TrackingSpanUiParent = HashSet()
member val UiElementNeighbour = Dictionary()
/// Caches the current used TrackingSpans per line. One line can contain multiple trackingSpans
member val TrackingSpans = Dictionary<int, ResizeArray<_>>()
/// Text view for accessing the adornment layer.
member val View: IWpfTextView = view
member val LensLayer = view.GetAdornmentLayer "Lens"
/// Tracks the recent first + last visible line numbers for adornment layout logic.
member val RecentFirstVsblLineNmbr = 0 with get, set
member val RecentLastVsblLineNmbr = 0 with get, set
/// Tracks the adornments on the layer.
member val AddedAdornments = HashSet()
/// Cancellation token source for the layout changed event. Needed to abort previous async-work.
member val LayoutChangedCts = new CancellationTokenSource() with get, set
/// Tracks the last used buffer snapshot, should be preferred used in combination with mutex.
member val CurrentBufferSnapshot = null with get, set
/// Helper method which returns the start line number of a tracking span
member _.GetTrackingSpanStartLine (snapshot:ITextSnapshot) (trackingSpan:ITrackingSpan) =
snapshot.GetLineNumberFromPosition(trackingSpan.GetStartPoint(snapshot).Position)
/// Helper method which returns the start line number of a tracking span
member _.TryGetTSpanStartLine (snapshot:ITextSnapshot) (trackingSpan:ITrackingSpan) =
let pos = trackingSpan.GetStartPoint(snapshot).Position
if snapshot.Length - 1 < pos then None
else pos |> snapshot.GetLineNumberFromPosition |> Some
member self.UpdateTrackingSpansFast (snapshot:ITextSnapshot) lineNumber =
if lineNumber |> self.TrackingSpans.ContainsKey then
let currentTrackingSpans = self.TrackingSpans.[lineNumber] |> ResizeArray // We need a copy because we modify the list.
for trackingSpan in currentTrackingSpans do
let newLineOption = self.TryGetTSpanStartLine snapshot trackingSpan
match newLineOption with
| None -> ()
| Some newLine ->
if newLine <> lineNumber then
// We're on a new line and need to check whether we're currently in another grid
// (because somehow there were multiple trackingSpans per line).
if self.TrackingSpanUiParent.Contains trackingSpan then
self.TrackingSpanUiParent.Remove trackingSpan |> ignore
self.UiElementNeighbour.Remove self.UiElements.[trackingSpan] |> ignore
// remove our entry in the line cache dictionary
self.TrackingSpans.[lineNumber].Remove(trackingSpan) |> ignore
// if the cache entry for the old line is now empty remove it completely
if self.TrackingSpans.[lineNumber].Count = 0 then
self.TrackingSpans.Remove lineNumber |> ignore
// now re-register our tracking span in the cache dict.
// Check whether the new line has no existing entry to add a fresh one.
// If there is already one we put our grid into the grid of the first entry of the line.
if newLine |> self.TrackingSpans.ContainsKey |> not then
self.TrackingSpans.[newLine] <- ResizeArray()
else
let neighbour =
self.UiElements.[self.TrackingSpans.[newLine] |> Seq.last] // This fails if a tracking span has no ui element!
self.UiElementNeighbour.[self.UiElements.[trackingSpan]] <- neighbour
self.TrackingSpanUiParent.Add trackingSpan |> ignore
// And finally add us to the cache again.
self.TrackingSpans.[newLine].Add(trackingSpan)
// Be sure that the uiElement of the trackingSpan is viRecentLastVsblLineNmbr the visible line space.
if newLine < self.RecentFirstVsblLineNmbr || newLine > self.RecentLastVsblLineNmbr then
if self.UiElements.ContainsKey trackingSpan then
let mutable element = self.UiElements.[trackingSpan]
element.Visibility <- Visibility.Hidden
member _.CreateDefaultStackPanel () =
let grid = Grid(Visibility = Visibility.Hidden)
Canvas.SetLeft(grid, 0.)
Canvas.SetTop(grid, 0.)
grid
/// Helper methods which invokes every action which is needed for new trackingSpans
member self.AddTrackingSpan (trackingSpan:ITrackingSpan)=
let snapshot = buffer.CurrentSnapshot
let startLineNumber = snapshot.GetLineNumberFromPosition(trackingSpan.GetStartPoint(snapshot).Position)
let uiElement =
if self.UiElements.ContainsKey trackingSpan then
#if DEBUG
logErrorf "Added a tracking span twice, this is not allowed and will result in invalid values! %A" (trackingSpan.GetText snapshot)
#endif
self.UiElements.[trackingSpan]
else
let defaultStackPanel = self.CreateDefaultStackPanel()
self.UiElements.[trackingSpan] <- defaultStackPanel
defaultStackPanel
if self.TrackingSpans.ContainsKey startLineNumber then
self.TrackingSpans.[startLineNumber].Add trackingSpan
let neighbour =
self.UiElements.[self.TrackingSpans.[startLineNumber] |> Seq.last] // This fails if a tracking span has no ui element!
self.UiElementNeighbour.[uiElement] <- neighbour
self.TrackingSpanUiParent.Add trackingSpan |> ignore
else
self.TrackingSpans.[startLineNumber] <- ResizeArray()
self.TrackingSpans.[startLineNumber].Add trackingSpan
uiElement
member self.HandleBufferChanged(e:TextContentChangedEventArgs) =
try
let oldSnapshot = e.Before
let snapshot = e.After
self.CurrentBufferSnapshot <- snapshot
for line in oldSnapshot.Lines do
let lineNumber = line.LineNumber
self.UpdateTrackingSpansFast snapshot lineNumber
let firstLine = view.TextViewLines.FirstVisibleLine
view.DisplayTextLineContainingBufferPosition (firstLine.Start, 0., ViewRelativePosition.Top)
self.RelayoutRequested.Enqueue(())
with e ->
#if DEBUG
logErrorf "Error in lens provider: %A" e
#else
ignore e
#endif
/// Public non-thread-safe method to add lens for a given tracking span.
/// Returns an UIElement which can be used to add Ui elements and to remove the lens later.
member self.AddLens (trackingSpan:ITrackingSpan) =
if trackingSpan.TextBuffer <> buffer then failwith "TrackingSpan text buffer does not equal with Lens text buffer"
let Grid = self.AddTrackingSpan trackingSpan
self.RelayoutRequested.Enqueue(())
Grid :> UIElement
/// Public non-thread-safe method to remove lens for a given tracking span.
member self.RemoveLens (trackingSpan:ITrackingSpan) =
if self.UiElements.ContainsKey trackingSpan then
let Grid = self.UiElements.[trackingSpan]
Grid.Children.Clear()
self.UiElements.Remove trackingSpan |> ignore
try
self.LensLayer.RemoveAdornment(Grid)
with e ->
#if DEBUG
logExceptionWithContext(e, "Removing lens")
#else
ignore e
#endif
#if DEBUG
else
logWarningf "No ui element is attached to this tracking span!"
#endif
let lineNumber =
(trackingSpan.GetStartPoint self.CurrentBufferSnapshot).Position
|> self.CurrentBufferSnapshot.GetLineNumberFromPosition
if self.TrackingSpans.ContainsKey lineNumber then
#if DEBUG
if self.TrackingSpans.[lineNumber].Remove trackingSpan |> not then
logWarningf "No tracking span is accociated with this line number %d!" lineNumber
#endif
if self.TrackingSpans.[lineNumber].Count = 0 then
self.TrackingSpans.Remove lineNumber |> ignore
#if DEBUG
else
logWarningf "No tracking span is accociated with this line number %d!" lineNumber
#endif
member self.AddUiElementToLens (trackingSpan:ITrackingSpan, uiElement:UIElement) =
let Grid = self.UiElements.[trackingSpan]
Grid.Children.Add uiElement |> ignore
member self.AddUiElementToLensOnce (trackingSpan:ITrackingSpan, uiElement:UIElement)=
let Grid = self.UiElements.[trackingSpan]
if uiElement |> Grid.Children.Contains |> not then
self.AddUiElementToLens (trackingSpan, uiElement)
member self.RemoveUiElementFromLens (trackingSpan:ITrackingSpan, uiElement:UIElement) =
let Grid = self.UiElements.[trackingSpan]
Grid.Children.Remove(uiElement) |> ignore
member self.HandleLayoutChanged (e:TextViewLayoutChangedEventArgs) =
try
// We can cancel existing stuff because the algorithm supports abortion without any data loss
self.LayoutChangedCts.Cancel()
self.LayoutChangedCts.Dispose()
self.LayoutChangedCts <- new CancellationTokenSource()
let buffer = e.NewSnapshot
let recentVisibleLineNumbers = Set [self.RecentFirstVsblLineNmbr .. self.RecentLastVsblLineNmbr]
let firstVisibleLineNumber, lastVisibleLineNumber =
let first, last =
view.TextViewLines.FirstVisibleLine,
view.TextViewLines.LastVisibleLine
buffer.GetLineNumberFromPosition(first.Start.Position),
buffer.GetLineNumberFromPosition(last.Start.Position)
let visibleLineNumbers = Set [firstVisibleLineNumber .. lastVisibleLineNumber]
let nonVisibleLineNumbers = Set.difference recentVisibleLineNumbers visibleLineNumbers
let newVisibleLineNumbers = Set.difference visibleLineNumbers recentVisibleLineNumbers
let applyFuncOnLineStackPanels (line:IWpfTextViewLine) (func:Grid -> unit) =
let lineNumber = line.Snapshot.GetLineNumberFromPosition(line.Start.Position)
if (self.TrackingSpans.ContainsKey lineNumber) && (self.TrackingSpans.[lineNumber]) |> (Seq.isEmpty >> not) then
for trackingSpan in self.TrackingSpans.[lineNumber] do
let success, ui = self.UiElements.TryGetValue trackingSpan
if success then
func ui
if nonVisibleLineNumbers.Count > 0 || newVisibleLineNumbers.Count > 0 then
for lineNumber in nonVisibleLineNumbers do
if lineNumber > 0 && lineNumber < buffer.LineCount then
try
let line =
(buffer.GetLineFromLineNumber lineNumber).Start
|> view.GetTextViewLineContainingBufferPosition
applyFuncOnLineStackPanels line (fun ui ->
ui.Visibility <- Visibility.Hidden
)
with e ->
#if DEBUG
logErrorf "Error in non visible lines iteration %A" e
#else
ignore e
#endif
for lineNumber in newVisibleLineNumbers do
try
let line =
(buffer.GetLineFromLineNumber lineNumber).Start
|> view.GetTextViewLineContainingBufferPosition
applyFuncOnLineStackPanels line (fun ui ->
ui.Visibility <- Visibility.Visible
self.LayoutUIElementOnLine view line ui
)
with e ->
#if DEBUG
logErrorf "Error in new visible lines iteration %A" e
#else
ignore e
#endif
if not e.VerticalTranslation && e.NewViewState.ViewportHeight <> e.OldViewState.ViewportHeight then
self.RelayoutRequested.Enqueue() // Unfortunately zooming requires a relayout too, to ensure that no weird layout happens due to unkown reasons.
if self.RelayoutRequested.Count > 0 then
self.RelayoutRequested.Dequeue() |> ignore
for lineNumber in visibleLineNumbers do
let line =
(buffer.GetLineFromLineNumber lineNumber).Start
|> view.GetTextViewLineContainingBufferPosition
applyFuncOnLineStackPanels line (fun ui ->
ui.Visibility <- Visibility.Visible
self.LayoutUIElementOnLine view line ui
)
// Save the new first and last visible lines for tracking
self.RecentFirstVsblLineNmbr <- firstVisibleLineNumber
self.RecentLastVsblLineNmbr <- lastVisibleLineNumber
self.AsyncCustomLayoutOperation visibleLineNumbers buffer
|> RoslynHelpers.StartAsyncSafe self.LayoutChangedCts.Token "HandleLayoutChanged"
with e ->
#if DEBUG
logExceptionWithContext (e, "Layout changed")
#else
ignore e
#endif
/// Layouts all stack panels on the line
member self.LayoutUIElementOnLine _ (line:ITextViewLine) (ui:Grid) =
let left, top =
try
let bounds = line.GetCharacterBounds(line.Start)
line.TextRight + 5.0, bounds.Top - 1.
with e ->
#if DEBUG
logExceptionWithContext (e, "Error in layout ui element on line")
#else
ignore e
#endif
Canvas.GetLeft ui, Canvas.GetTop ui
Canvas.SetLeft(ui, left)
Canvas.SetTop(ui, top)
member self.AsyncCustomLayoutOperation visibleLineNumbers buffer =
asyncMaybe {
// Suspend 5 ms, instantly applying the layout to the adornment elements isn't needed
// and would consume too much performance
do! Async.Sleep(5) |> liftAsync // Skip at least one frames
do! Async.SwitchToContext self.UiContext |> liftAsync
let layer = self.LensLayer
do! Async.Sleep(495) |> liftAsync
try
for visibleLineNumber in visibleLineNumbers do
if self.TrackingSpans.ContainsKey visibleLineNumber then
self.TrackingSpans.[visibleLineNumber]
|> Seq.map (fun trackingSpan ->
let success, res = self.UiElements.TryGetValue trackingSpan
if success then
res
else null
)
|> Seq.filter (fun ui -> not(isNull ui) && not(self.AddedAdornments.Contains ui))
|> Seq.iter(fun grid ->
layer.AddAdornment(AdornmentPositioningBehavior.OwnerControlled, Nullable(),
self, grid, AdornmentRemovedCallback(fun _ _ -> self.AddedAdornments.Remove grid |> ignore)) |> ignore
self.AddedAdornments.Add grid |> ignore
let line =
let l = buffer.GetLineFromLineNumber visibleLineNumber
view.GetTextViewLineContainingBufferPosition l.Start
self.LayoutUIElementOnLine view line grid
)
with e ->
#if DEBUG
logExceptionWithContext (e, "LayoutChanged, processing new visible lines")
#else
ignore e
#endif
} |> Async.Ignore
\ No newline at end of file
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace Microsoft.VisualStudio.FSharp.Editor
open System
open Microsoft.VisualStudio.Text
open Microsoft.VisualStudio.Text.Editor
open System.ComponentModel.Composition
open Microsoft.VisualStudio.Utilities
open Microsoft.VisualStudio.Shell
open Microsoft.VisualStudio
open Microsoft.VisualStudio.LanguageServices
open Microsoft.VisualStudio.Text.Tagging
open Microsoft.CodeAnalysis.ExternalAccess.FSharp.Editor.Shared.Utilities
[<Export(typeof<IWpfTextViewCreationListener>)>]
[<Export(typeof<IViewTaggerProvider>)>]
[<ContentType(FSharpConstants.FSharpContentTypeName)>]
[<TextViewRole(PredefinedTextViewRoles.Document)>]
type internal LensProvider
[<ImportingConstructor>]
(
[<Import(typeof<SVsServiceProvider>)>] serviceProvider: IServiceProvider,
textDocumentFactory: ITextDocumentFactoryService,
metadataAsSource: FSharpMetadataAsSourceService,
typeMap : FSharpClassificationTypeMap Lazy,
settings: EditorOptions
) =
let tryGetTextDocument (buffer: ITextBuffer) (factory: ITextDocumentFactoryService) =
match factory.TryGetTextDocument buffer with
| true, document -> Some document
| _ -> None
let lensProviders = ResizeArray()
let componentModel = Package.GetGlobalService(typeof<ComponentModelHost.SComponentModel>) :?> ComponentModelHost.IComponentModel
let workspace = componentModel.GetService<VisualStudioWorkspace>()
let addLensProvider wpfView buffer =
textDocumentFactory
|> tryGetTextDocument buffer
|> Option.map (fun document -> workspace.CurrentSolution.GetDocumentIdsWithFilePath(document.FilePath))
|> Option.bind Seq.tryHead
|> Option.map (fun documentId ->
let service = LensService(serviceProvider, workspace, documentId, buffer, metadataAsSource, componentModel.GetService(), typeMap, LensDisplayService(wpfView, buffer), settings)
let provider = (wpfView, service)
wpfView.Closed.Add (fun _ -> lensProviders.Remove provider |> ignore)
lensProviders.Add(provider))
[<Export(typeof<AdornmentLayerDefinition>); Name("Lens");
Order(Before = PredefinedAdornmentLayers.Text);
TextViewRole(PredefinedTextViewRoles.Document)>]
member val LensAdornmentLayerDefinition : AdornmentLayerDefinition = null with get, set
interface IWpfTextViewCreationListener with
override _.TextViewCreated view =
if settings.Lens.Enabled then
let provider =
lensProviders
|> Seq.tryFind (fun (v, _) -> v = view)
if provider.IsNone then
addLensProvider view (view.TextBuffer) |> ignore
\ No newline at end of file
......@@ -72,16 +72,6 @@ type LanguageServicePerformanceOptions =
EnableParallelCheckingWithSignatureFiles = false
EnableParallelReferenceResolution = false }
[<CLIMutable>]
type LensOptions =
{ Enabled : bool
UseColors: bool
Prefix : string }
static member Default =
{ Enabled = false
UseColors = false
Prefix = "// " }
[<CLIMutable>]
type AdvancedOptions =
{ IsBlockStructureEnabled: bool
......@@ -116,7 +106,6 @@ type EditorOptions
store.Register LanguageServicePerformanceOptions.Default
store.Register AdvancedOptions.Default
store.Register IntelliSenseOptions.Default
store.Register LensOptions.Default
store.Register FormattingOptions.Default
member _.IntelliSense : IntelliSenseOptions = store.Get()
......@@ -124,7 +113,6 @@ type EditorOptions
member _.CodeFixes : CodeFixesOptions = store.Get()
member _.LanguageServicePerformance : LanguageServicePerformanceOptions = store.Get()
member _.Advanced: AdvancedOptions = store.Get()
member _.Lens: LensOptions = store.Get()
member _.Formatting : FormattingOptions = store.Get()
interface Microsoft.CodeAnalysis.Host.IWorkspaceService
......@@ -175,12 +163,6 @@ module internal OptionsUI =
override this.CreateView() =
upcast LanguageServicePerformanceOptionControl()
[<Guid(Guids.lensOptionPageIdString)>]
type internal LensOptionPage() =
inherit AbstractOptionPage<LensOptions>()
override this.CreateView() =
upcast LensOptionControl()
[<Guid(Guids.advancedSettingsPageIdSring)>]
type internal AdvancedSettingsOptionPage() =
inherit AbstractOptionPage<AdvancedOptions>()
......
......@@ -242,11 +242,6 @@
<target state="translated">Upřesnit</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Formátování</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Erweitert</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Formatierung</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Opciones avanzadas</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Formato</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Avancé</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Mise en forme</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Avanzate</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Formattazione</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">詳細</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">書式設定</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">고급</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">서식</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Zaawansowane</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Formatowanie</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Avançado</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Formatação</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Дополнительный</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Форматирование</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">Gelişmiş</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">Biçimlendirme</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">高级</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">正在格式化</target>
......
......@@ -242,11 +242,6 @@
<target state="translated">進階</target>
<note />
</trans-unit>
<trans-unit id="6013">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="6014">
<source>Formatting</source>
<target state="translated">格式化</target>
......
<UserControl x:Class="Microsoft.VisualStudio.FSharp.UIResources.LensOptionControl"
x:ClassModifier="internal"
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:Microsoft.VisualStudio.FSharp.UIResources"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="OptionPageStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel>
<GroupBox Header="{x:Static local:Strings.Lens}">
<StackPanel>
<StackPanel>
<CheckBox x:Name="enableLens" IsChecked="{Binding Enabled}"
Content="{x:Static local:Strings.Lens_Switch}"/>
</StackPanel>
<StackPanel Margin="15 0 0 0">
<CheckBox x:Name="useColors" IsChecked="{Binding UseColors}"
Content="{x:Static local:Strings.Lens_UseColors}"
IsEnabled="{Binding IsChecked, ElementName=enableLens}"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="70" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{x:Static local:Strings.Lens_Prefix}"/>
<TextBox x:Name="prefix" Grid.Column="1"
Text="{Binding Prefix, UpdateSourceTrigger=PropertyChanged}"
HorizontalContentAlignment="Right"
VerticalContentAlignment="Center" Margin="7,0,-116,0"
IsEnabled="{Binding IsChecked, ElementName=enableLens}">
</TextBox>
</Grid>
</StackPanel>
</StackPanel>
</GroupBox>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Microsoft.VisualStudio.FSharp.UIResources
{
/// <summary>
/// Interaction logic for LensOptionPage.xaml
/// </summary>
internal partial class LensOptionControl : UserControl
{
public LensOptionControl()
{
InitializeComponent();
}
}
}
......@@ -231,42 +231,6 @@ public class Strings {
}
}
/// <summary>
/// Looks up a localized string similar to Lens.
/// </summary>
public static string Lens {
get {
return ResourceManager.GetString("Lens", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Annotation prefix.
/// </summary>
public static string Lens_Prefix {
get {
return ResourceManager.GetString("Lens_Prefix", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Enable Lens (Experimental).
/// </summary>
public static string Lens_Switch {
get {
return ResourceManager.GetString("Lens_Switch", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Use colors in annotations.
/// </summary>
public static string Lens_UseColors {
get {
return ResourceManager.GetString("Lens_UseColors", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Navigation links.
/// </summary>
......
......@@ -120,18 +120,6 @@
<data name="Always_place_opens_at_top_level" xml:space="preserve">
<value>Always place open statements at the top level</value>
</data>
<data name="Lens" xml:space="preserve">
<value>Lens</value>
</data>
<data name="Lens_Switch" xml:space="preserve">
<value>Enable Lens (Experimental)</value>
</data>
<data name="Lens_Prefix" xml:space="preserve">
<value>Annotation prefix</value>
</data>
<data name="Lens_UseColors" xml:space="preserve">
<value>Use colors in annotations</value>
</data>
<data name="Code_Fixes" xml:space="preserve">
<value>Code Fixes</value>
</data>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Povolit funkci Lens (experimentální)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Předpona poznámky</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Použít barvy v poznámkách</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Opravy kódu</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Lens aktivieren (experimentell)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Anmerkungspräfix</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Farben in Anmerkungen verwenden</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Codefehlerbehebungen</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Habilitar Lens (experimental)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Prefijo de anotación</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Usar colores en anotaciones</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Correcciones de código</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Activer Lens (expérimental)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Préfixe d'annotation</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Utiliser des couleurs dans les annotations</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Correctifs du code</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Abilita Lens (sperimentale)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Prefisso annotazione</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Usa colori nelle annotazioni</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Correzioni del codice</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Lens を有効にする (試験段階)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">注釈のプレフィックス</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">注釈でカラーを使用する</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">コード修正</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Lens 사용(실험적)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">주석 접두사</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">주석에서 색 사용</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">코드 수정 사항</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Włącz funkcję Lens (eksperymentalna)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Prefiks adnotacji</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Stosuj kolory w adnotacjach</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Poprawki kodu</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Habilitar Lens (Experimental)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Prefixo da anotação</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Usar cores em anotações</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Correções de Código</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Включить Lens (экспериментальная функция)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Префикс примечания</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Использовать цветные примечания</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Исправления кода</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">Lens’i Etkinleştir (Deneysel)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">Ek açıklama ön eki</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">Ek açıklamalarda renk kullan</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">Kod Düzeltmeleri</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">启用 Lens (试验)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">批注前缀</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">在批注中使用颜色</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">代码修补程序</target>
......
......@@ -12,26 +12,6 @@
<target state="new">Inline Hints</target>
<note />
</trans-unit>
<trans-unit id="Lens">
<source>Lens</source>
<target state="translated">Lens</target>
<note />
</trans-unit>
<trans-unit id="Lens_Switch">
<source>Enable Lens (Experimental)</source>
<target state="translated">啟用 Lens (實驗性)</target>
<note />
</trans-unit>
<trans-unit id="Lens_Prefix">
<source>Annotation prefix</source>
<target state="translated">註釋前置詞</target>
<note />
</trans-unit>
<trans-unit id="Lens_UseColors">
<source>Use colors in annotations</source>
<target state="translated">在註釋中使用色彩</target>
<note />
</trans-unit>
<trans-unit id="Code_Fixes">
<source>Code Fixes</source>
<target state="translated">程式碼修正</target>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册