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

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

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

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

@ -25,7 +25,7 @@ namespace ICSharpCode.ComponentInspector.AddIn @@ -25,7 +25,7 @@ namespace ICSharpCode.ComponentInspector.AddIn
{
instance = this;
this.TitleName = StringParser.Parse("${res:ComponentInspector.ToolsMenu.ShowComponentInspectorMenuItem}");
SetLocalizedTitle("${res:ComponentInspector.ToolsMenu.ShowComponentInspectorMenuItem}");
// HACK: Due to various static members in the ComponentInspector
// 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 @@ -60,7 +60,7 @@ namespace Hornung.ResourceToolkit.Gui
{
LoggingService.Debug("ResourceToolkit: Creating new UnusedResourceKeysViewContent");
this.TitleName = StringParser.Parse("${res:Hornung.ResourceToolkit.UnusedResourceKeys.Title}");
SetLocalizedTitle("${res:Hornung.ResourceToolkit.UnusedResourceKeys.Title}");
if (unusedKeys == null) {
throw new ArgumentNullException("unusedKeys");

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

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

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

@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.Core.Presentation;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@ -73,6 +74,10 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -73,6 +74,10 @@ namespace ICSharpCode.SharpDevelop.Gui
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 {
get { return tabPageText; }
set {
@ -336,6 +341,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -336,6 +341,7 @@ namespace ICSharpCode.SharpDevelop.Gui
}
string titleName;
LanguageDependendExtension titleNameLocalizeExtension;
string IViewContent.TitleName {
get {
@ -351,12 +357,36 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -351,12 +357,36 @@ namespace ICSharpCode.SharpDevelop.Gui
public string TitleName {
get { return titleName; }
protected set {
if (titleNameLocalizeExtension != null) {
titleNameLocalizeExtension.PropertyChanged -= OnTitleNameLocalizationChanged;
titleNameLocalizeExtension = null;
}
if (titleName != value) {
titleName = value;
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
#region IDisposable

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

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

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

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

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

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

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

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

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

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

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

@ -18,19 +18,19 @@ namespace ICSharpCode.Core.Presentation @@ -18,19 +18,19 @@ namespace ICSharpCode.Core.Presentation
/// Custom binding to allow direct bindings of option properties to WPF controls.
/// </summary>
/// <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 />
/// Do not use PropertyService directly!<br />
/// This markup extension can only be used in OptionPanels or other <br />classes implementing IOptionBindingContainer!
/// <br />
/// Example:
/// </remarks>
/// <example>
/// <code>
/// {sd:OptionBinding addin:XmlEditorAddInOptions.ShowAttributesWhenFolded}
/// </code>
/// <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.
/// </remarks>
/// </example>
public class OptionBinding : MarkupExtension
{
public string PropertyName { get; set; }

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

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