Merge remote-tracking branch 'official-origin/develop' into develop

This commit is contained in:
mpagani 2025-04-14 09:43:59 +02:00
commit 000821aedb
19 changed files with 93 additions and 58 deletions

View file

@ -195,23 +195,7 @@ This document shows the translation status of each locale file in the repository
</details> </details>
### ![ru__RU](https://img.shields.io/badge/ru__RU-98.67%25-yellow) ### ![ru__RU](https://img.shields.io/badge/ru__RU-%E2%88%9A-brightgreen)
<details>
<summary>Missing keys in ru_RU.axaml</summary>
- Text.Configure.Git.PreferredMergeMode
- Text.ConfirmEmptyCommit.Continue
- Text.ConfirmEmptyCommit.NoLocalChanges
- Text.ConfirmEmptyCommit.StageAllThenCommit
- Text.ConfirmEmptyCommit.WithLocalChanges
- Text.WorkingCopy.ConfirmCommitWithFilter
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
- Text.WorkingCopy.Conflicts.UseMine
- Text.WorkingCopy.Conflicts.UseTheirs
</details>
### ![ta__IN](https://img.shields.io/badge/ta__IN-98.67%25-yellow) ### ![ta__IN](https://img.shields.io/badge/ta__IN-98.67%25-yellow)

View file

@ -1 +1 @@
2025.12 2025.13

View file

@ -40,7 +40,7 @@ namespace SourceGit.Commands
foreach (var b in branches) foreach (var b in branches)
{ {
if (b.IsLocal && !string.IsNullOrEmpty(b.Upstream)) if (b.IsLocal && !string.IsNullOrEmpty(b.Upstream))
b.IsUpsteamGone = !remoteBranches.Contains(b.Upstream); b.IsUpstreamGone = !remoteBranches.Contains(b.Upstream);
} }
return branches; return branches;
@ -86,7 +86,7 @@ namespace SourceGit.Commands
branch.Head = parts[1]; branch.Head = parts[1];
branch.IsCurrent = parts[2] == "*"; branch.IsCurrent = parts[2] == "*";
branch.Upstream = parts[3]; branch.Upstream = parts[3];
branch.IsUpsteamGone = false; branch.IsUpstreamGone = false;
if (branch.IsLocal && !string.IsNullOrEmpty(parts[4]) && !parts[4].Equals("=", StringComparison.Ordinal)) if (branch.IsLocal && !string.IsNullOrEmpty(parts[4]) && !parts[4].Equals("=", StringComparison.Ordinal))
branch.TrackStatus = new QueryTrackStatus(WorkingDirectory, branch.Name, branch.Upstream).Result(); branch.TrackStatus = new QueryTrackStatus(WorkingDirectory, branch.Name, branch.Upstream).Result();

View file

@ -34,7 +34,7 @@ namespace SourceGit.Models
public string Upstream { get; set; } public string Upstream { get; set; }
public BranchTrackStatus TrackStatus { get; set; } public BranchTrackStatus TrackStatus { get; set; }
public string Remote { get; set; } public string Remote { get; set; }
public bool IsUpsteamGone { get; set; } public bool IsUpstreamGone { get; set; }
public string FriendlyName => IsLocal ? Name : $"{Remote}/{Name}"; public string FriendlyName => IsLocal ? Name : $"{Remote}/{Name}";
} }

View file

@ -157,6 +157,7 @@
<x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">Автозагрузка изменений</x:String> <x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">Автозагрузка изменений</x:String>
<x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">Минут(а/ы)</x:String> <x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">Минут(а/ы)</x:String>
<x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">Внешний репозиторий по умолчанию</x:String> <x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">Внешний репозиторий по умолчанию</x:String>
<x:String x:Key="Text.Configure.Git.PreferredMergeMode" xml:space="preserve">Предпочтительный режим слияния</x:String>
<x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">ОТСЛЕЖИВАНИЕ ПРОБЛЕМ</x:String> <x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">ОТСЛЕЖИВАНИЕ ПРОБЛЕМ</x:String>
<x:String x:Key="Text.Configure.IssueTracker.AddSampleAzure" xml:space="preserve">Добавить пример правила Azure DevOps</x:String> <x:String x:Key="Text.Configure.IssueTracker.AddSampleAzure" xml:space="preserve">Добавить пример правила Azure DevOps</x:String>
<x:String x:Key="Text.Configure.IssueTracker.AddSampleGiteeIssue" xml:space="preserve">Добавить пример правила для тем в Gitea</x:String> <x:String x:Key="Text.Configure.IssueTracker.AddSampleGiteeIssue" xml:space="preserve">Добавить пример правила для тем в Gitea</x:String>
@ -181,6 +182,10 @@
<x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">Цвет</x:String> <x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">Цвет</x:String>
<x:String x:Key="Text.ConfigureWorkspace.Name" xml:space="preserve">Имя</x:String> <x:String x:Key="Text.ConfigureWorkspace.Name" xml:space="preserve">Имя</x:String>
<x:String x:Key="Text.ConfigureWorkspace.Restore" xml:space="preserve">Восстанавливать вкладки при запуске</x:String> <x:String x:Key="Text.ConfigureWorkspace.Restore" xml:space="preserve">Восстанавливать вкладки при запуске</x:String>
<x:String x:Key="Text.ConfirmEmptyCommit.Continue" xml:space="preserve">ПРОДОЛЖИТЬ</x:String>
<x:String x:Key="Text.ConfirmEmptyCommit.NoLocalChanges" xml:space="preserve">Обнаружена пустая ревизия! Вы хотите продолжить (--allow-empty)?</x:String>
<x:String x:Key="Text.ConfirmEmptyCommit.StageAllThenCommit" xml:space="preserve">Подготовить все и зафиксировать ревизию</x:String>
<x:String x:Key="Text.ConfirmEmptyCommit.WithLocalChanges" xml:space="preserve">Обнаружена пустая ревизия! Вы хотите продолжить (--allow-empty) или отложить все, затем зафиксировать ревизию?</x:String>
<x:String x:Key="Text.ConventionalCommit" xml:space="preserve">Общепринятый помощник по ревизии</x:String> <x:String x:Key="Text.ConventionalCommit" xml:space="preserve">Общепринятый помощник по ревизии</x:String>
<x:String x:Key="Text.ConventionalCommit.BreakingChanges" xml:space="preserve">Кардинальные изменения:</x:String> <x:String x:Key="Text.ConventionalCommit.BreakingChanges" xml:space="preserve">Кардинальные изменения:</x:String>
<x:String x:Key="Text.ConventionalCommit.ClosedIssue" xml:space="preserve">Закрытая тема:</x:String> <x:String x:Key="Text.ConventionalCommit.ClosedIssue" xml:space="preserve">Закрытая тема:</x:String>
@ -725,8 +730,13 @@
<x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">Запустить событие щелчка</x:String> <x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">Запустить событие щелчка</x:String>
<x:String x:Key="Text.WorkingCopy.CommitToEdit" xml:space="preserve">Зафиксировать (Редактировать)</x:String> <x:String x:Key="Text.WorkingCopy.CommitToEdit" xml:space="preserve">Зафиксировать (Редактировать)</x:String>
<x:String x:Key="Text.WorkingCopy.CommitWithAutoStage" xml:space="preserve">Подготовить все изменения и зафиксировать</x:String> <x:String x:Key="Text.WorkingCopy.CommitWithAutoStage" xml:space="preserve">Подготовить все изменения и зафиксировать</x:String>
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithFilter">Вы подготовили {0} файл(ов), но отображается только {1} файл(ов) ({2} файл(ов) отфильтровано). Вы хотите продолжить?</x:String>
<x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">ОБНАРУЖЕНЫ КОНФЛИКТЫ</x:String> <x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">ОБНАРУЖЕНЫ КОНФЛИКТЫ</x:String>
<x:String x:Key="Text.WorkingCopy.Conflicts.OpenExternalMergeTool" xml:space="preserve">ОТКРЫТЬ ВНЕШНИЙ ИНСТРУМЕНТ СЛИЯНИЯ</x:String>
<x:String x:Key="Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts" xml:space="preserve">ОТКРЫТЬ ВСЕ КОНФЛИКТЫ ВО ВНЕШНЕМ ИНСТРУМЕНТЕ СЛИЯНИЯ</x:String>
<x:String x:Key="Text.WorkingCopy.Conflicts.Resolved" xml:space="preserve">КОНФЛИКТЫ ФАЙЛОВ РАЗРЕШЕНЫ</x:String> <x:String x:Key="Text.WorkingCopy.Conflicts.Resolved" xml:space="preserve">КОНФЛИКТЫ ФАЙЛОВ РАЗРЕШЕНЫ</x:String>
<x:String x:Key="Text.WorkingCopy.Conflicts.UseMine" xml:space="preserve">ИСПОЛЬЗОВАТЬ МОИ</x:String>
<x:String x:Key="Text.WorkingCopy.Conflicts.UseTheirs" xml:space="preserve">ИСПОЛЬЗОВАТЬ ИХ</x:String>
<x:String x:Key="Text.WorkingCopy.IncludeUntracked" xml:space="preserve">ВКЛЮЧИТЬ НЕОТСЛЕЖИВАЕМЫЕ ФАЙЛЫ</x:String> <x:String x:Key="Text.WorkingCopy.IncludeUntracked" xml:space="preserve">ВКЛЮЧИТЬ НЕОТСЛЕЖИВАЕМЫЕ ФАЙЛЫ</x:String>
<x:String x:Key="Text.WorkingCopy.NoCommitHistories" xml:space="preserve">НЕТ ПОСЛЕДНИХ ВХОДНЫХ СООБЩЕНИЙ</x:String> <x:String x:Key="Text.WorkingCopy.NoCommitHistories" xml:space="preserve">НЕТ ПОСЛЕДНИХ ВХОДНЫХ СООБЩЕНИЙ</x:String>
<x:String x:Key="Text.WorkingCopy.NoCommitTemplates" xml:space="preserve">НЕТ ШАБЛОНОВ РЕВИЗИИ</x:String> <x:String x:Key="Text.WorkingCopy.NoCommitTemplates" xml:space="preserve">НЕТ ШАБЛОНОВ РЕВИЗИИ</x:String>

View file

@ -41,11 +41,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="11.2.6" /> <PackageReference Include="Avalonia" Version="11.2.7" />
<PackageReference Include="Avalonia.Desktop" Version="11.2.6" /> <PackageReference Include="Avalonia.Desktop" Version="11.2.7" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.6" /> <PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.7" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.6" /> <PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.7" />
<PackageReference Include="Avalonia.Diagnostics" Version="11.2.6" Condition="'$(Configuration)' == 'Debug'" /> <PackageReference Include="Avalonia.Diagnostics" Version="11.2.7" Condition="'$(Configuration)' == 'Debug'" />
<PackageReference Include="Avalonia.AvaloniaEdit" Version="11.2.0" /> <PackageReference Include="Avalonia.AvaloniaEdit" Version="11.2.0" />
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.2.0" /> <PackageReference Include="AvaloniaEdit.TextMate" Version="11.2.0" />
<PackageReference Include="Azure.AI.OpenAI" Version="2.2.0-beta.4" /> <PackageReference Include="Azure.AI.OpenAI" Version="2.2.0-beta.4" />

View file

@ -44,7 +44,7 @@ namespace SourceGit.ViewModels
public bool ShowUpstreamGoneTip public bool ShowUpstreamGoneTip
{ {
get => Backend is Models.Branch { IsUpsteamGone: true }; get => Backend is Models.Branch { IsUpstreamGone: true };
} }
public string Tooltip public string Tooltip

View file

@ -32,7 +32,11 @@ namespace SourceGit.ViewModels
return Task.Run(() => return Task.Run(() =>
{ {
new Commands.UpdateRef(_repo.FullPath, Local.FullName, To.FullName, SetProgressDescription).Exec(); new Commands.UpdateRef(_repo.FullPath, Local.FullName, To.FullName, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true)); CallUIThread(() =>
{
_repo.NavigateToCommit(To.Head);
_repo.SetWatcherEnabled(true);
});
return true; return true;
}); });
} }

View file

@ -34,14 +34,14 @@ namespace SourceGit.ViewModels
set => _repo.Settings.EnableForceOnFetch = value; set => _repo.Settings.EnableForceOnFetch = value;
} }
public Fetch(Repository repo, Models.Remote preferedRemote = null) public Fetch(Repository repo, Models.Remote preferredRemote = null)
{ {
_repo = repo; _repo = repo;
_fetchAllRemotes = preferedRemote == null; _fetchAllRemotes = preferredRemote == null;
if (preferedRemote != null) if (preferredRemote != null)
{ {
SelectedRemote = preferedRemote; SelectedRemote = preferredRemote;
} }
else if (!string.IsNullOrEmpty(_repo.Settings.DefaultRemote)) else if (!string.IsNullOrEmpty(_repo.Settings.DefaultRemote))
{ {
@ -83,6 +83,7 @@ namespace SourceGit.ViewModels
CallUIThread(() => CallUIThread(() =>
{ {
_repo.NavigateToBranchDelayed(_repo.CurrentBranch?.Upstream);
_repo.MarkFetched(); _repo.MarkFetched();
_repo.SetWatcherEnabled(true); _repo.SetWatcherEnabled(true);
}); });

View file

@ -32,7 +32,11 @@ namespace SourceGit.ViewModels
return Task.Run(() => return Task.Run(() =>
{ {
new Commands.Fetch(_repo.FullPath, Local, Upstream, SetProgressDescription).Exec(); new Commands.Fetch(_repo.FullPath, Local, Upstream, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true)); CallUIThread(() =>
{
_repo.NavigateToBranchDelayed(Upstream.FullName);
_repo.SetWatcherEnabled(true);
});
return true; return true;
}); });
} }

View file

@ -62,7 +62,11 @@ namespace SourceGit.ViewModels
return Task.Run(() => return Task.Run(() =>
{ {
new Commands.Merge(_repo.FullPath, _sourceName, Mode.Arg, SetProgressDescription).Exec(); new Commands.Merge(_repo.FullPath, _sourceName, Mode.Arg, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true)); CallUIThread(() =>
{
_repo.NavigateToBranchDelayed(_repo.CurrentBranch?.FullName);
_repo.SetWatcherEnabled(true);
});
return true; return true;
}); });
} }

View file

@ -192,7 +192,11 @@ namespace SourceGit.ViewModels
rs = new Commands.Stash(_repo.FullPath).Pop("stash@{0}"); rs = new Commands.Stash(_repo.FullPath).Pop("stash@{0}");
} }
CallUIThread(() => _repo.SetWatcherEnabled(true)); CallUIThread(() =>
{
_repo.NavigateToBranchDelayed(_repo.CurrentBranch?.FullName);
_repo.SetWatcherEnabled(true);
});
return rs; return rs;
}); });
} }

View file

@ -773,6 +773,11 @@ namespace SourceGit.ViewModels
NavigateToCommit(_currentBranch.Head); NavigateToCommit(_currentBranch.Head);
} }
public void NavigateToBranchDelayed(string branch)
{
_navigateToBranchDelayed = branch;
}
public void ClearHistoriesFilter() public void ClearHistoriesFilter()
{ {
_settings.HistoriesFilters.Clear(); _settings.HistoriesFilters.Clear();
@ -991,7 +996,16 @@ namespace SourceGit.ViewModels
_histories.IsLoading = false; _histories.IsLoading = false;
_histories.Commits = commits; _histories.Commits = commits;
_histories.Graph = graph; _histories.Graph = graph;
if (!string.IsNullOrEmpty(_navigateToBranchDelayed))
{
var branch = _branches.Find(x => x.FullName == _navigateToBranchDelayed);
if (branch != null)
NavigateToCommit(branch.Head);
}
} }
_navigateToBranchDelayed = string.Empty;
}); });
} }
@ -2588,5 +2602,7 @@ namespace SourceGit.ViewModels
private bool _isAutoFetching = false; private bool _isAutoFetching = false;
private Timer _autoFetchTimer = null; private Timer _autoFetchTimer = null;
private DateTime _lastFetchTime = DateTime.MinValue; private DateTime _lastFetchTime = DateTime.MinValue;
private string _navigateToBranchDelayed = string.Empty;
} }
} }

View file

@ -59,7 +59,14 @@
FontFamily="{DynamicResource Fonts.Monospace}" FontFamily="{DynamicResource Fonts.Monospace}"
FontSize="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorFontSize}" FontSize="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorFontSize}"
TabWidth="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorTabWidth}" TabWidth="{Binding Source={x:Static vm:Preferences.Instance}, Path=EditorTabWidth}"
BlameData="{Binding Data}"/> BlameData="{Binding Data}">
<ToolTip.IsOpen>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="$self.IsPointerOver"/>
<Binding Path="$self.(ToolTip.Tip)" Converter="{x:Static ObjectConverters.IsNotNull}"/>
</MultiBinding>
</ToolTip.IsOpen>
</v:BlameTextEditor>
<!-- Not supported mask (for binary files) --> <!-- Not supported mask (for binary files) -->
<StackPanel Orientation="Vertical" <StackPanel Orientation="Vertical"

View file

@ -180,7 +180,6 @@ namespace SourceGit.Views
{ {
var msg = blame.GetCommitMessage(info.CommitSHA); var msg = blame.GetCommitMessage(info.CommitSHA);
ToolTip.SetTip(this, msg); ToolTip.SetTip(this, msg);
ToolTip.SetIsOpen(this, true);
} }
return; return;
@ -188,7 +187,7 @@ namespace SourceGit.Views
} }
Cursor = Cursor.Default; Cursor = Cursor.Default;
ToolTip.SetIsOpen(this, false); ToolTip.SetTip(this, null);
} }
} }

View file

@ -114,6 +114,13 @@
PointerEntered="OnSHAPointerEntered" PointerEntered="OnSHAPointerEntered"
PointerPressed="OnSHAPressed" PointerPressed="OnSHAPressed"
ToolTip.ShowDelay="0"> ToolTip.ShowDelay="0">
<ToolTip.IsOpen>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="$self.IsPointerOver"/>
<Binding Path="$self.(ToolTip.Tip)" Converter="{x:Static ObjectConverters.IsNotNull}"/>
</MultiBinding>
</ToolTip.IsOpen>
<TextBlock.DataTemplates> <TextBlock.DataTemplates>
<DataTemplate DataType="m:Commit"> <DataTemplate DataType="m:Commit">
<StackPanel MinWidth="400" Orientation="Vertical"> <StackPanel MinWidth="400" Orientation="Vertical">
@ -152,6 +159,13 @@
PointerEntered="OnSHAPointerEntered" PointerEntered="OnSHAPointerEntered"
PointerPressed="OnSHAPressed" PointerPressed="OnSHAPressed"
ToolTip.ShowDelay="0"> ToolTip.ShowDelay="0">
<ToolTip.IsOpen>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="$self.IsPointerOver"/>
<Binding Path="$self.(ToolTip.Tip)" Converter="{x:Static ObjectConverters.IsNotNull}"/>
</MultiBinding>
</ToolTip.IsOpen>
<TextBlock.DataTemplates> <TextBlock.DataTemplates>
<DataTemplate DataType="m:Commit"> <DataTemplate DataType="m:Commit">
<StackPanel MinWidth="400" Orientation="Vertical"> <StackPanel MinWidth="400" Orientation="Vertical">
@ -189,6 +203,13 @@
FullMessage="{Binding #ThisControl.FullMessage}" FullMessage="{Binding #ThisControl.FullMessage}"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
TextWrapping="Wrap"> TextWrapping="Wrap">
<ToolTip.IsOpen>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="$self.IsPointerOver"/>
<Binding Path="$self.(ToolTip.Tip)" Converter="{x:Static ObjectConverters.IsNotNull}"/>
</MultiBinding>
</ToolTip.IsOpen>
<v:CommitMessagePresenter.DataTemplates> <v:CommitMessagePresenter.DataTemplates>
<DataTemplate DataType="m:Commit"> <DataTemplate DataType="m:Commit">
<StackPanel MinWidth="400" Orientation="Vertical"> <StackPanel MinWidth="400" Orientation="Vertical">

View file

@ -133,12 +133,7 @@ namespace SourceGit.Views
Dispatcher.UIThread.Invoke(() => Dispatcher.UIThread.Invoke(() =>
{ {
if (ctl.IsEffectivelyVisible && ctl.DataContext is string newSHA && newSHA == sha) if (ctl.IsEffectivelyVisible && ctl.DataContext is string newSHA && newSHA == sha)
{
ToolTip.SetTip(ctl, c); ToolTip.SetTip(ctl, c);
if (ctl.IsPointerOver)
ToolTip.SetIsOpen(ctl, true);
}
}); });
}); });
} }

View file

@ -107,14 +107,9 @@ namespace SourceGit.Views
_lastHover = link; _lastHover = link;
if (!link.IsCommitSHA) if (!link.IsCommitSHA)
{
ToolTip.SetTip(this, link.Link); ToolTip.SetTip(this, link.Link);
ToolTip.SetIsOpen(this, true);
}
else else
{
ProcessHoverCommitLink(link); ProcessHoverCommitLink(link);
}
return; return;
} }
@ -264,12 +259,7 @@ namespace SourceGit.Views
// If we have already queried this SHA, just use it. // If we have already queried this SHA, just use it.
if (_inlineCommits.TryGetValue(sha, out var exist)) if (_inlineCommits.TryGetValue(sha, out var exist))
{ {
if (exist != null) ToolTip.SetTip(this, exist);
{
ToolTip.SetTip(this, exist);
ToolTip.SetIsOpen(this, true);
}
return; return;
} }
@ -294,10 +284,7 @@ namespace SourceGit.Views
// Make sure user still hovers the target SHA. // Make sure user still hovers the target SHA.
if (_lastHover == link && c != null) if (_lastHover == link && c != null)
{
ToolTip.SetTip(this, c); ToolTip.SetTip(this, c);
ToolTip.SetIsOpen(this, true);
}
} }
}); });
}); });

View file

@ -144,7 +144,6 @@ namespace SourceGit.Views
_lastHover = match; _lastHover = match;
SetCurrentValue(CursorProperty, Cursor.Parse("Hand")); SetCurrentValue(CursorProperty, Cursor.Parse("Hand"));
ToolTip.SetTip(this, match.Link); ToolTip.SetTip(this, match.Link);
ToolTip.SetIsOpen(this, true);
e.Handled = true; e.Handled = true;
return; return;
} }