Browse Source

LocalizeExtension + StringParseExtension: implemented automatic update of text when the language changes.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4852 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
84576901fd
  1. 10
      src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs
  2. 1
      src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj
  3. 56
      src/Main/ICSharpCode.Core.Presentation/LanguageChangeWeakEventManager.cs
  4. 60
      src/Main/ICSharpCode.Core.Presentation/LocalizeExtension.cs
  5. 57
      src/Main/ICSharpCode.Core.Presentation/StringParseExtension.cs

10
src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs

@ -168,8 +168,9 @@ namespace ICSharpCode.Core @@ -168,8 +168,9 @@ namespace ICSharpCode.Core
{
if (e.Key == uiLanguageProperty && e.NewValue != e.OldValue) {
LoadLanguageResources((string)e.NewValue);
if (LanguageChanged != null)
LanguageChanged(null, e);
EventHandler handler = LanguageChanged;
if (handler != null)
handler(null, e);
}
}
@ -206,8 +207,9 @@ namespace ICSharpCode.Core @@ -206,8 +207,9 @@ namespace ICSharpCode.Core
ra.Load();
}
}
if (ClearCaches != null)
ClearCaches(null, EventArgs.Empty);
EventHandler handler = ClearCaches;
if (handler != null)
handler(null, EventArgs.Empty);
}
static Hashtable Load(string fileName)

1
src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj

@ -72,6 +72,7 @@ @@ -72,6 +72,7 @@
<Compile Include="GetBitmapExtension.cs" />
<Compile Include="IOptionBindingContainer.cs" />
<Compile Include="IStatusUpdate.cs" />
<Compile Include="LanguageChangeWeakEventManager.cs" />
<Compile Include="LocalizeExtension.cs" />
<Compile Include="Menu\IMenuItemBuilder.cs" />
<Compile Include="Menu\MenuCommand.cs" />

56
src/Main/ICSharpCode.Core.Presentation/LanguageChangeWeakEventManager.cs

@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Windows;
namespace ICSharpCode.Core.Presentation
{
public sealed class LanguageChangeWeakEventManager : WeakEventManager
{
/// <summary>
/// Adds a weak event listener.
/// </summary>
public static void AddListener(IWeakEventListener listener)
{
CurrentManager.ProtectedAddListener(null, listener);
}
/// <summary>
/// Removes a weak event listener.
/// </summary>
public static void RemoveListener(IWeakEventListener listener)
{
CurrentManager.ProtectedRemoveListener(null, listener);
}
/// <summary>
/// Gets the current manager.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")]
private static LanguageChangeWeakEventManager CurrentManager {
get {
LanguageChangeWeakEventManager manager = (LanguageChangeWeakEventManager)GetCurrentManager(typeof(LanguageChangeWeakEventManager));
if (manager == null) {
manager = new LanguageChangeWeakEventManager();
SetCurrentManager(typeof(LanguageChangeWeakEventManager), manager);
}
return manager;
}
}
protected override void StartListening(object source)
{
ResourceService.LanguageChanged += DeliverEvent;
}
protected override void StopListening(object source)
{
ResourceService.LanguageChanged -= DeliverEvent;
}
}
}

60
src/Main/ICSharpCode.Core.Presentation/LocalizeExtension.cs

@ -7,7 +7,6 @@ @@ -7,7 +7,6 @@
using System;
using System.ComponentModel;
using System.Reflection;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
@ -18,28 +17,69 @@ namespace ICSharpCode.Core.Presentation @@ -18,28 +17,69 @@ namespace ICSharpCode.Core.Presentation
/// Markup extension that retrieves localized resource strings.
/// </summary>
[MarkupExtensionReturnType(typeof(string))]
public class LocalizeExtension : MarkupExtension
public sealed class LocalizeExtension : MarkupExtension, INotifyPropertyChanged, IWeakEventListener
{
public LocalizeExtension(string key)
{
this.key = key;
this.UsesAccessors = true;
this.UpdateOnLanguageChange = true;
}
protected string key;
string key;
/// <summary>
/// Set whether the text uses accessors.
/// If set to true (default), accessors will be converted to WPF syntax.
/// </summary>
public bool UsesAccessors { get; set; }
/// <summary>
/// Set whether the LocalizeExtension should use a binding to automatically
/// change the text on language changes.
/// The default value is true.
/// </summary>
public bool UpdateOnLanguageChange { get; set; }
bool isRegisteredForLanguageChange;
public override object ProvideValue(IServiceProvider serviceProvider)
{
try {
string result = ResourceService.GetString(key);
if (UsesAccessors)
result = MenuService.ConvertLabel(result);
return result;
} catch (ResourceNotFoundException) {
return "{Localize:" + key + "}";
if (UpdateOnLanguageChange) {
if (!isRegisteredForLanguageChange) {
isRegisteredForLanguageChange = true;
LanguageChangeWeakEventManager.AddListener(this);
}
return (new Binding("Value") { Source = this }).ProvideValue(serviceProvider);
} else {
return this.Value;
}
}
public string Value {
get {
try {
string result = ResourceService.GetString(key);
if (UsesAccessors)
result = MenuService.ConvertLabel(result);
return result;
} catch (ResourceNotFoundException) {
return "{Localize:" + key + "}";
}
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
static readonly System.ComponentModel.PropertyChangedEventArgs
valueChangedEventArgs = new System.ComponentModel.PropertyChangedEventArgs("Value");
bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, valueChangedEventArgs);
return true;
}
}
}

57
src/Main/ICSharpCode.Core.Presentation/StringParseExtension.cs

@ -18,24 +18,65 @@ namespace ICSharpCode.Core.Presentation @@ -18,24 +18,65 @@ namespace ICSharpCode.Core.Presentation
/// Markup extension that works like StringParser.Parse
/// </summary>
[MarkupExtensionReturnType(typeof(string))]
public class StringParseExtension : MarkupExtension
public sealed class StringParseExtension : MarkupExtension, INotifyPropertyChanged, IWeakEventListener
{
protected string text;
public bool UsesAccessors { get; set; }
string text;
public StringParseExtension(string text)
{
this.text = text;
this.UsesAccessors = true;
this.UpdateOnLanguageChange = true;
}
/// <summary>
/// Set whether the text uses accessors.
/// If set to true (default), accessors will be converted to WPF syntax.
/// </summary>
public bool UsesAccessors { get; set; }
/// <summary>
/// Set whether the LocalizeExtension should use a binding to automatically
/// change the text on language changes.
/// The default value is true.
/// </summary>
public bool UpdateOnLanguageChange { get; set; }
bool isRegisteredForLanguageChange;
public override object ProvideValue(IServiceProvider serviceProvider)
{
string result = StringParser.Parse(text);
if (UsesAccessors)
result = MenuService.ConvertLabel(result);
return result;
if (UpdateOnLanguageChange) {
if (!isRegisteredForLanguageChange) {
isRegisteredForLanguageChange = true;
LanguageChangeWeakEventManager.AddListener(this);
}
return (new Binding("Value") { Source = this }).ProvideValue(serviceProvider);
} else {
return this.Value;
}
}
public string Value {
get {
string result = StringParser.Parse(text);
if (UsesAccessors)
result = MenuService.ConvertLabel(result);
return result;
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
static readonly System.ComponentModel.PropertyChangedEventArgs
valueChangedEventArgs = new System.ComponentModel.PropertyChangedEventArgs("Value");
bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, valueChangedEventArgs);
return true;
}
}
}

Loading…
Cancel
Save