Browse Source

Improved automatic language switching of workbench elements.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4853 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 16 years ago
parent
commit
2f49e082e5
  1. 3
      data/layouts/LayoutConfig.xml
  2. 2
      src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/PackageFilesView.cs
  3. 2
      src/AddIns/Misc/ComponentInspector/ComponentInspector.AddIn/Src/ComponentInspectorView.cs
  4. 2
      src/AddIns/Misc/ResourceToolkit/Project/Src/Gui/UnusedResourceKeysViewContent.cs
  5. 2
      src/AddIns/Misc/StartPage/Project/Src/StartPageViewContent.cs
  6. 10
      src/Main/Base/Project/Src/Commands/ChooseLayoutCommand.cs
  7. 30
      src/Main/Base/Project/Src/Gui/AbstractViewContent.cs
  8. 2
      src/Main/Base/Project/Src/Gui/BrowserDisplayBinding/HtmlViewPane.cs
  9. 2
      src/Main/Base/Project/Src/Gui/IWorkbenchWindow.cs
  10. 2
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs
  11. 7
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs
  12. 17
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/LayoutConfiguration.cs
  13. 60
      src/Main/ICSharpCode.Core.Presentation/LocalizeExtension.cs
  14. 8
      src/Main/ICSharpCode.Core.Presentation/OptionBinding.cs
  15. 40
      src/Main/ICSharpCode.Core.Presentation/StringParseExtension.cs

3
data/layouts/LayoutConfig.xml

@ -1,14 +1,17 @@
<LayoutConfig> <LayoutConfig>
<Layout name = "Default" <Layout name = "Default"
displayName = "${res:ICSharpCode.SharpDevelop.Commands.ChooseLayoutCommand.DefaultItem}"
file = "Default.xml" file = "Default.xml"
readonly = "False"/> readonly = "False"/>
<Layout name = "Debug" <Layout name = "Debug"
displayName = "${res:ICSharpCode.SharpDevelop.Commands.ChooseLayoutCommand.DebugItem}"
file = "Debug.xml" file = "Debug.xml"
readonly = "False"/> readonly = "False"/>
<Layout name = "Plain" <Layout name = "Plain"
displayName = "${res:ICSharpCode.SharpDevelop.Commands.ChooseLayoutCommand.PlainItem}"
file = "Plain.xml" file = "Plain.xml"
readonly = "True"/> readonly = "True"/>

2
src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/PackageFilesView.cs

@ -41,7 +41,7 @@ namespace ICSharpCode.WixBinding
{ {
packageFilesControl = new WixPackageFilesControl(); packageFilesControl = new WixPackageFilesControl();
packageFilesControl.DirtyChanged += delegate { base.RaiseIsDirtyChanged(); }; packageFilesControl.DirtyChanged += delegate { base.RaiseIsDirtyChanged(); };
TitleName = StringParser.Parse("${res:ICSharpCode.WixBinding.PackageFilesView.Title}"); SetLocalizedTitle("${res:ICSharpCode.WixBinding.PackageFilesView.Title}");
this.project = project; this.project = project;
WorkbenchSingleton.Workbench.ActiveViewContentChanged += ActiveViewContentChanged; WorkbenchSingleton.Workbench.ActiveViewContentChanged += ActiveViewContentChanged;

2
src/AddIns/Misc/ComponentInspector/ComponentInspector.AddIn/Src/ComponentInspectorView.cs

@ -25,7 +25,7 @@ namespace ICSharpCode.ComponentInspector.AddIn
{ {
instance = this; instance = this;
this.TitleName = StringParser.Parse("${res:ComponentInspector.ToolsMenu.ShowComponentInspectorMenuItem}"); SetLocalizedTitle("${res:ComponentInspector.ToolsMenu.ShowComponentInspectorMenuItem}");
// HACK: Due to various static members in the ComponentInspector // HACK: Due to various static members in the ComponentInspector
// the ObjectBrowser does not like being re-used after being disposed. // the ObjectBrowser does not like being re-used after being disposed.

2
src/AddIns/Misc/ResourceToolkit/Project/Src/Gui/UnusedResourceKeysViewContent.cs

@ -60,7 +60,7 @@ namespace Hornung.ResourceToolkit.Gui
{ {
LoggingService.Debug("ResourceToolkit: Creating new UnusedResourceKeysViewContent"); LoggingService.Debug("ResourceToolkit: Creating new UnusedResourceKeysViewContent");
this.TitleName = StringParser.Parse("${res:Hornung.ResourceToolkit.UnusedResourceKeys.Title}"); SetLocalizedTitle("${res:Hornung.ResourceToolkit.UnusedResourceKeys.Title}");
if (unusedKeys == null) { if (unusedKeys == null) {
throw new ArgumentNullException("unusedKeys"); throw new ArgumentNullException("unusedKeys");

2
src/AddIns/Misc/StartPage/Project/Src/StartPageViewContent.cs

@ -23,7 +23,7 @@ namespace ICSharpCode.StartPage
public StartPageViewContent() public StartPageViewContent()
{ {
this.TitleName = StringParser.Parse("${res:StartPage.StartPageContentName}"); SetLocalizedTitle("${res:StartPage.StartPageContentName}");
} }
} }
} }

10
src/Main/Base/Project/Src/Commands/ChooseLayoutCommand.cs

@ -27,10 +27,12 @@ namespace ICSharpCode.SharpDevelop.Commands
public ChooseLayoutCommand() public ChooseLayoutCommand()
{ {
LayoutConfiguration.LayoutChanged += new EventHandler(LayoutChanged); LayoutConfiguration.LayoutChanged += new EventHandler(LayoutChanged);
ResourceService.LanguageChanged += new EventHandler(ResourceService_LanguageChanged);
foreach (string layout in LayoutConfiguration.DefaultLayouts) { }
LayoutConfiguration.GetLayout(layout).DisplayName = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Commands.ChooseLayoutCommand." + layout + "Item}");
} void ResourceService_LanguageChanged(object sender, EventArgs e)
{
OnOwnerChanged(e);
} }
int oldItem = 0; int oldItem = 0;

30
src/Main/Base/Project/Src/Gui/AbstractViewContent.cs

@ -5,6 +5,7 @@
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
using ICSharpCode.Core.Presentation;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
@ -73,6 +74,10 @@ namespace ICSharpCode.SharpDevelop.Gui
public event EventHandler TabPageTextChanged; public event EventHandler TabPageTextChanged;
/// <summary>
/// Gets/Sets the title of the current tab page.
/// This value will be passed through the string parser before being displayed.
/// </summary>
public string TabPageText { public string TabPageText {
get { return tabPageText; } get { return tabPageText; }
set { set {
@ -336,6 +341,7 @@ namespace ICSharpCode.SharpDevelop.Gui
} }
string titleName; string titleName;
LanguageDependendExtension titleNameLocalizeExtension;
string IViewContent.TitleName { string IViewContent.TitleName {
get { get {
@ -351,12 +357,36 @@ namespace ICSharpCode.SharpDevelop.Gui
public string TitleName { public string TitleName {
get { return titleName; } get { return titleName; }
protected set { protected set {
if (titleNameLocalizeExtension != null) {
titleNameLocalizeExtension.PropertyChanged -= OnTitleNameLocalizationChanged;
titleNameLocalizeExtension = null;
}
if (titleName != value) { if (titleName != value) {
titleName = value; titleName = value;
OnTitleNameChanged(EventArgs.Empty); OnTitleNameChanged(EventArgs.Empty);
} }
} }
} }
/// <summary>
/// Sets a localized title that will update automatically when the language changes.
/// </summary>
/// <param name="text">The input to the string parser which will localize title.</param>
protected void SetLocalizedTitle(string text)
{
titleNameLocalizeExtension = new StringParseExtension(text) { UsesAccessors = false };
titleNameLocalizeExtension.PropertyChanged += OnTitleNameLocalizationChanged;
OnTitleNameLocalizationChanged(null, null);
}
void OnTitleNameLocalizationChanged(object sender, EventArgs e)
{
string value = titleNameLocalizeExtension.Value;
if (titleName != value) {
titleName = value;
OnTitleNameChanged(EventArgs.Empty);
}
}
#endregion #endregion
#region IDisposable #region IDisposable

2
src/Main/Base/Project/Src/Gui/BrowserDisplayBinding/HtmlViewPane.cs

@ -77,7 +77,7 @@ namespace ICSharpCode.SharpDevelop.BrowserDisplayBinding
if (title != null) if (title != null)
title = title.Trim(); title = title.Trim();
if (title == null || title.Length == 0) if (title == null || title.Length == 0)
TitleName = ResourceService.GetString("ICSharpCode.SharpDevelop.BrowserDisplayBinding.Browser"); SetLocalizedTitle("${res:ICSharpCode.SharpDevelop.BrowserDisplayBinding.Browser}");
else else
TitleName = title; TitleName = title;
} }

2
src/Main/Base/Project/Src/Gui/IWorkbenchWindow.cs

@ -76,8 +76,6 @@ namespace ICSharpCode.SharpDevelop.Gui
/// </summary> /// </summary>
void SelectWindow(); void SelectWindow();
void RedrawContent();
/// <summary> /// <summary>
/// Is called when the title of this window has changed. /// Is called when the title of this window has changed.
/// </summary> /// </summary>

2
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs

@ -32,7 +32,7 @@ namespace ICSharpCode.SharpDevelop.Gui
this.layout = layout; this.layout = layout;
this.Name = descriptor.Class.Replace('.', '_'); this.Name = descriptor.Class.Replace('.', '_');
this.Title = StringParser.Parse(descriptor.Title); this.SetBinding(TitleProperty, new StringParseExtension(descriptor.Title).CreateBinding());
placeholder = new TextBlock { Text = this.Title }; placeholder = new TextBlock { Text = this.Title };
this.Content = placeholder; this.Content = placeholder;
this.Icon = PresentationResourceService.GetPixelSnappedImage(descriptor.Icon); this.Icon = PresentationResourceService.GetPixelSnappedImage(descriptor.Icon);

7
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs

@ -37,6 +37,7 @@ namespace ICSharpCode.SharpDevelop.Gui
this.dockLayout = dockLayout; this.dockLayout = dockLayout;
viewContents = new ViewContentCollection(this); viewContents = new ViewContentCollection(this);
ResourceService.LanguageChanged += OnTabPageTextChanged;
OnTitleNameChanged(this, EventArgs.Empty); OnTitleNameChanged(this, EventArgs.Empty);
} }
@ -231,6 +232,7 @@ namespace ICSharpCode.SharpDevelop.Gui
void Dispose() void Dispose()
{ {
ResourceService.LanguageChanged -= OnTabPageTextChanged;
// DetachContent must be called before the controls are disposed // DetachContent must be called before the controls are disposed
List<IViewContent> viewContents = this.ViewContents.ToList(); List<IViewContent> viewContents = this.ViewContents.ToList();
this.ViewContents.Clear(); this.ViewContents.Clear();
@ -388,11 +390,6 @@ namespace ICSharpCode.SharpDevelop.Gui
CommandManager.InvalidateRequerySuggested(); CommandManager.InvalidateRequerySuggested();
} }
public void RedrawContent()
{
RefreshTabPageTexts();
}
void RefreshTabPageTexts() void RefreshTabPageTexts()
{ {
if (viewTabControl != null) { if (viewTabControl != null) {

17
src/Main/Base/Project/Src/Gui/Workbench/Layouts/LayoutConfiguration.cs

@ -39,15 +39,9 @@ namespace ICSharpCode.SharpDevelop.Gui
const string DefaultLayoutName = "Default"; const string DefaultLayoutName = "Default";
public static string[] DefaultLayouts = new string[] {
"Default",
"Debug",
"Plain"
};
string name; string name;
string fileName; string fileName;
string displayName = null; string displayName;
bool readOnly; bool readOnly;
bool custom; bool custom;
@ -81,10 +75,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public string DisplayName { public string DisplayName {
get { get {
return displayName == null ? Name : displayName; return displayName == null ? Name : StringParser.Parse(displayName);
}
set {
displayName = value;
} }
} }
@ -106,6 +97,8 @@ namespace ICSharpCode.SharpDevelop.Gui
name = el.GetAttribute("name"); name = el.GetAttribute("name");
fileName = el.GetAttribute("file"); fileName = el.GetAttribute("file");
readOnly = Boolean.Parse(el.GetAttribute("readonly")); readOnly = Boolean.Parse(el.GetAttribute("readonly"));
if (el.HasAttribute("displayName"))
displayName = el.GetAttribute("displayName");
this.custom = custom; this.custom = custom;
} }
@ -226,6 +219,8 @@ namespace ICSharpCode.SharpDevelop.Gui
w.WriteAttributeString("name", lc.name); w.WriteAttributeString("name", lc.name);
w.WriteAttributeString("file", lc.fileName); w.WriteAttributeString("file", lc.fileName);
w.WriteAttributeString("readonly", lc.readOnly.ToString()); w.WriteAttributeString("readonly", lc.readOnly.ToString());
if (lc.displayName != null)
w.WriteAttributeString("displayName", lc.displayName);
w.WriteEndElement(); w.WriteEndElement();
} }
} }

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

@ -17,7 +17,7 @@ namespace ICSharpCode.Core.Presentation
/// Markup extension that retrieves localized resource strings. /// Markup extension that retrieves localized resource strings.
/// </summary> /// </summary>
[MarkupExtensionReturnType(typeof(string))] [MarkupExtensionReturnType(typeof(string))]
public sealed class LocalizeExtension : MarkupExtension, INotifyPropertyChanged, IWeakEventListener public sealed class LocalizeExtension : LanguageDependendExtension
{ {
public LocalizeExtension(string key) public LocalizeExtension(string key)
{ {
@ -34,6 +34,29 @@ namespace ICSharpCode.Core.Presentation
/// </summary> /// </summary>
public bool UsesAccessors { get; set; } public bool UsesAccessors { get; set; }
public override string Value {
get {
try {
string result = ResourceService.GetString(key);
if (UsesAccessors)
result = MenuService.ConvertLabel(result);
return result;
} catch (ResourceNotFoundException) {
return "{Localize:" + key + "}";
}
}
}
}
public abstract class LanguageDependendExtension : MarkupExtension, INotifyPropertyChanged, IWeakEventListener
{
protected LanguageDependendExtension()
{
this.UpdateOnLanguageChange = true;
}
public abstract string Value { get; }
/// <summary> /// <summary>
/// Set whether the LocalizeExtension should use a binding to automatically /// Set whether the LocalizeExtension should use a binding to automatically
/// change the text on language changes. /// change the text on language changes.
@ -46,40 +69,41 @@ namespace ICSharpCode.Core.Presentation
public override object ProvideValue(IServiceProvider serviceProvider) public override object ProvideValue(IServiceProvider serviceProvider)
{ {
if (UpdateOnLanguageChange) { if (UpdateOnLanguageChange) {
if (!isRegisteredForLanguageChange) { return CreateBinding().ProvideValue(serviceProvider);
isRegisteredForLanguageChange = true;
LanguageChangeWeakEventManager.AddListener(this);
}
return (new Binding("Value") { Source = this }).ProvideValue(serviceProvider);
} else { } else {
return this.Value; return this.Value;
} }
} }
public string Value { public Binding CreateBinding()
get { {
try { return new Binding("Value") { Source = this, Mode = BindingMode.OneWay };
string result = ResourceService.GetString(key); }
if (UsesAccessors)
result = MenuService.ConvertLabel(result);
return result; event System.ComponentModel.PropertyChangedEventHandler ChangedEvent;
} catch (ResourceNotFoundException) {
return "{Localize:" + key + "}"; public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged {
add {
if (!isRegisteredForLanguageChange) {
isRegisteredForLanguageChange = true;
LanguageChangeWeakEventManager.AddListener(this);
} }
ChangedEvent += value;
} }
remove { ChangedEvent -= value; }
} }
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
static readonly System.ComponentModel.PropertyChangedEventArgs static readonly System.ComponentModel.PropertyChangedEventArgs
valueChangedEventArgs = new System.ComponentModel.PropertyChangedEventArgs("Value"); valueChangedEventArgs = new System.ComponentModel.PropertyChangedEventArgs("Value");
bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e) bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{ {
var handler = PropertyChanged; var handler = ChangedEvent;
if (handler != null) if (handler != null)
handler(this, valueChangedEventArgs); handler(this, valueChangedEventArgs);
return true; return true;
} }
} }
} }

8
src/Main/ICSharpCode.Core.Presentation/OptionBinding.cs

@ -18,19 +18,19 @@ namespace ICSharpCode.Core.Presentation
/// Custom binding to allow direct bindings of option properties to WPF controls. /// Custom binding to allow direct bindings of option properties to WPF controls.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Properties accessed by this binding have to be managed by a custom<br /> /// Properties accessed by this binding have to be managed by a custom
/// settings class, which contains all settings as static properties or fields.<br /> /// settings class, which contains all settings as static properties or fields.<br />
/// Do not use PropertyService directly!<br /> /// Do not use PropertyService directly!<br />
/// This markup extension can only be used in OptionPanels or other <br />classes implementing IOptionBindingContainer! /// This markup extension can only be used in OptionPanels or other <br />classes implementing IOptionBindingContainer!
/// <br /> /// </remarks>
/// Example: /// <example>
/// <code> /// <code>
/// {sd:OptionBinding addin:XmlEditorAddInOptions.ShowAttributesWhenFolded} /// {sd:OptionBinding addin:XmlEditorAddInOptions.ShowAttributesWhenFolded}
/// </code> /// </code>
/// <br /> /// <br />
/// Whereas 'sd' is the xml namespace of ICSharpCode.Core.Presentation.OptionBinding and 'addin'<br /> /// Whereas 'sd' is the xml namespace of ICSharpCode.Core.Presentation.OptionBinding and 'addin'<br />
/// is the xml namespace, in which your settings class is defined. /// is the xml namespace, in which your settings class is defined.
/// </remarks> /// </example>
public class OptionBinding : MarkupExtension public class OptionBinding : MarkupExtension
{ {
public string PropertyName { get; set; } public string PropertyName { get; set; }

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

@ -18,7 +18,7 @@ namespace ICSharpCode.Core.Presentation
/// Markup extension that works like StringParser.Parse /// Markup extension that works like StringParser.Parse
/// </summary> /// </summary>
[MarkupExtensionReturnType(typeof(string))] [MarkupExtensionReturnType(typeof(string))]
public sealed class StringParseExtension : MarkupExtension, INotifyPropertyChanged, IWeakEventListener public sealed class StringParseExtension : LanguageDependendExtension
{ {
string text; string text;
@ -26,7 +26,6 @@ namespace ICSharpCode.Core.Presentation
{ {
this.text = text; this.text = text;
this.UsesAccessors = true; this.UsesAccessors = true;
this.UpdateOnLanguageChange = true;
} }
/// <summary> /// <summary>
@ -35,29 +34,7 @@ namespace ICSharpCode.Core.Presentation
/// </summary> /// </summary>
public bool UsesAccessors { get; set; } public bool UsesAccessors { get; set; }
/// <summary> public override string Value {
/// 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)
{
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 { get {
string result = StringParser.Parse(text); string result = StringParser.Parse(text);
if (UsesAccessors) if (UsesAccessors)
@ -65,18 +42,5 @@ namespace ICSharpCode.Core.Presentation
return 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