From 36e3b1d753c46f700174adce3e479c2d437d2f24 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 16 Jan 2019 15:24:42 +0000 Subject: [Packaging] Fix language metadata accessibility in project options Tabbing to the language combo box in project options - NuGet Package - Metadata would not announce the label associated with the combo box with Voice Over. The problem is that the combo box with an enabled text entry does not work well with the accessibility library. To fix this the combo box no longer allows free text entry. If no language is selected then 'None' is displayed. Fixes VSTS #753486 - Accessibility: NuGet Package Metadata: Voice Over is not reading the label of the "Language" combo box. Fixes VSTS #753489 - Usability: NuGet Package Metadata: Text area inside the "Language" combo box does not serves any purpose and seems not to be useful in this scenario. --- ...ui.GtkNuGetPackageMetadataOptionsPanelWidget.cs | 4 +-- .../GtkNuGetPackageMetadataOptionsPanelWidget.cs | 42 +++++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) (limited to 'main/src/addins/MonoDevelop.Packaging') diff --git a/main/src/addins/MonoDevelop.Packaging/Gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/Gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs index 49a3bd30d5..7af75f47b5 100644 --- a/main/src/addins/MonoDevelop.Packaging/Gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs +++ b/main/src/addins/MonoDevelop.Packaging/Gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs @@ -48,7 +48,7 @@ namespace MonoDevelop.Packaging.Gui private global::Gtk.HBox packageLanguageHBox; - private global::Gtk.ComboBoxEntry packageLanguageComboBox; + private global::Gtk.ComboBox packageLanguageComboBox; private global::Gtk.Label packageLanguageLabel; @@ -321,7 +321,7 @@ namespace MonoDevelop.Packaging.Gui this.packageLanguageHBox.Name = "packageLanguageHBox"; this.packageLanguageHBox.Spacing = 6; // Container child packageLanguageHBox.Gtk.Box+BoxChild - this.packageLanguageComboBox = global::Gtk.ComboBoxEntry.NewText(); + this.packageLanguageComboBox = global::Gtk.ComboBox.NewText(); this.packageLanguageComboBox.Name = "packageLanguageComboBox"; this.packageLanguageHBox.Add(this.packageLanguageComboBox); global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.packageLanguageHBox[this.packageLanguageComboBox])); diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs index 3f6f091de5..eec702edb8 100644 --- a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs +++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs @@ -42,6 +42,8 @@ namespace MonoDevelop.Packaging.Gui NuGetPackageMetadata metadata; bool projectOriginallyHadMetadata; bool hasPackageId; + List languages; + ListStore languagesListStore; public GtkNuGetPackageMetadataOptionsPanelWidget () { @@ -168,7 +170,7 @@ namespace MonoDevelop.Packaging.Gui packageCopyrightTextBox.Text = GetTextBoxText (metadata.Copyright); packageDevelopmentDependencyCheckBox.Active = metadata.DevelopmentDependency; packageIconUrlTextBox.Text = GetTextBoxText (metadata.IconUrl); - packageLanguageComboBox.Entry.Text = GetTextBoxText (metadata.Language); + LoadLanguage (metadata.Language); packageLicenseUrlTextBox.Text = GetTextBoxText (metadata.LicenseUrl); packageOwnersTextBox.Text = GetTextBoxText (metadata.Owners); packageProjectUrlTextBox.Text = GetTextBoxText (metadata.ProjectUrl); @@ -184,6 +186,24 @@ namespace MonoDevelop.Packaging.Gui return text ?? string.Empty; } + void LoadLanguage (string language) + { + if (string.IsNullOrEmpty (language)) { + packageLanguageComboBox.Active = 0; + return; + } + + int index = languages.IndexOf (language); + if (index >= 0) { + packageLanguageComboBox.Active = index + 1; + return; + } + + // Language does not match so we need to add it to the combo box. + TreeIter iter = languagesListStore.AppendValues (language); + packageLanguageComboBox.SetActiveIter (iter); + } + internal void Save (PackagingProject project) { UpdateMetadata (); @@ -220,7 +240,7 @@ namespace MonoDevelop.Packaging.Gui metadata.Copyright = packageCopyrightTextBox.Text; metadata.DevelopmentDependency = packageDevelopmentDependencyCheckBox.Active; metadata.IconUrl = packageIconUrlTextBox.Text; - metadata.Language = packageLanguageComboBox.Entry.Text; + metadata.Language = GetSelectedLanguage (); metadata.LicenseUrl = packageLicenseUrlTextBox.Text; metadata.Owners = packageOwnersTextBox.Text; metadata.ProjectUrl = packageProjectUrlTextBox.Text; @@ -231,20 +251,34 @@ namespace MonoDevelop.Packaging.Gui metadata.Title = packageTitleTextBox.Text; } + string GetSelectedLanguage () + { + if (packageLanguageComboBox.Active == 0) { + // 'None' selected. + return string.Empty; + } + return packageLanguageComboBox.ActiveText; + } + void PopulateLanguages () { - var languagesListStore = new ListStore (typeof (string)); + languagesListStore = new ListStore (typeof (string)); packageLanguageComboBox.Model = languagesListStore; - List languages = CultureInfo.GetCultures(CultureTypes.AllCultures) + languages = CultureInfo.GetCultures(CultureTypes.AllCultures) + .Where (c => !string.IsNullOrEmpty (c.Name)) .Select (c => c.Name) .ToList (); languages.Sort (); + languagesListStore.AppendValues (GettextCatalog.GetString ("None")); + foreach (string language in languages) { languagesListStore.AppendValues (language); } + + packageLanguageComboBox.Active = 0; } bool ProjectHasMetadata () -- cgit v1.2.3 From 6696164cbad523d46dab882b7ea51657e983c562 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 16 Jan 2019 15:51:47 +0000 Subject: [Packaging] Show language display name in project options for metadata In project options - NuGet Package - Metadata the language display name is shown in the language combo box. Previously the language code (e.g. 'en-GB') was displayed. The display name is more user friendly and also matches the behaviour of Visual Studio on Windows when it shows package metadata for .NET Standard projects. --- .../GtkNuGetPackageMetadataOptionsPanelWidget.cs | 44 +++++++++++++++++----- 1 file changed, 35 insertions(+), 9 deletions(-) (limited to 'main/src/addins/MonoDevelop.Packaging') diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs index eec702edb8..64d53a6214 100644 --- a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs +++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs @@ -42,7 +42,7 @@ namespace MonoDevelop.Packaging.Gui NuGetPackageMetadata metadata; bool projectOriginallyHadMetadata; bool hasPackageId; - List languages; + List languages; ListStore languagesListStore; public GtkNuGetPackageMetadataOptionsPanelWidget () @@ -193,7 +193,7 @@ namespace MonoDevelop.Packaging.Gui return; } - int index = languages.IndexOf (language); + int index = GetLanguageIndex (language); if (index >= 0) { packageLanguageComboBox.Active = index + 1; return; @@ -204,6 +204,17 @@ namespace MonoDevelop.Packaging.Gui packageLanguageComboBox.SetActiveIter (iter); } + int GetLanguageIndex (string language) + { + for (int i = 0; i < languages.Count; ++i) { + CultureInfo culture = languages [i]; + if (string.Equals (culture.Name, language, StringComparison.OrdinalIgnoreCase)) { + return i; + } + } + return -1; + } + internal void Save (PackagingProject project) { UpdateMetadata (); @@ -257,6 +268,13 @@ namespace MonoDevelop.Packaging.Gui // 'None' selected. return string.Empty; } + + int languageIndex = packageLanguageComboBox.Active - 1; + if (languageIndex < languages.Count) { + return languages [languageIndex].Name; + } + + // No match for language so just return the combo box text. return packageLanguageComboBox.ActiveText; } @@ -265,22 +283,30 @@ namespace MonoDevelop.Packaging.Gui languagesListStore = new ListStore (typeof (string)); packageLanguageComboBox.Model = languagesListStore; - languages = CultureInfo.GetCultures(CultureTypes.AllCultures) - .Where (c => !string.IsNullOrEmpty (c.Name)) - .Select (c => c.Name) - .ToList (); + languages = new List (); + + foreach (CultureInfo culture in CultureInfo.GetCultures (CultureTypes.AllCultures)) { + if (!string.IsNullOrEmpty (culture.Name)) { + languages.Add (culture); + } + } - languages.Sort (); + languages.Sort (CompareLanguages); languagesListStore.AppendValues (GettextCatalog.GetString ("None")); - foreach (string language in languages) { - languagesListStore.AppendValues (language); + foreach (CultureInfo language in languages) { + languagesListStore.AppendValues (language.DisplayName); } packageLanguageComboBox.Active = 0; } + static int CompareLanguages (CultureInfo x, CultureInfo y) + { + return string.Compare (x.DisplayName, y.DisplayName, StringComparison.CurrentCulture); + } + bool ProjectHasMetadata () { return !string.IsNullOrEmpty (metadata.Id); -- cgit v1.2.3 From b71b057d271943d250248b2b288d43e02b61788b Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 16 Jan 2019 16:04:42 +0000 Subject: [Packaging] Fix voice over announcing items twice for package metadata In project options - NuGet Package - Metadata tabbing through the UI controls would result in the label text being announced twice. This was because an accessibility label was being set twice - once as plain text, and then when associating the label with the main UI element via a role. --- .../GtkNuGetPackageMetadataOptionsPanelWidget.cs | 81 +++++++++------------- 1 file changed, 32 insertions(+), 49 deletions(-) (limited to 'main/src/addins/MonoDevelop.Packaging') diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs index 64d53a6214..8e2ab47e58 100644 --- a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs +++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs @@ -60,85 +60,68 @@ namespace MonoDevelop.Packaging.Gui packageReleaseNotesPaddingLabel.Accessible.Role = Atk.Role.Filler; packageIdTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.ID", - GettextCatalog.GetString ("ID"), - GettextCatalog.GetString ("Enter the ID of the NuGet package")); - packageIdTextBox.SetAccessibilityLabelRelationship (packageIdLabel); + packageIdLabel, + GettextCatalog.GetString ("Enter the ID of the NuGet package")); packageVersionTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Version", - GettextCatalog.GetString ("Version"), - GettextCatalog.GetString ("Enter the version of the NuGet package")); - packageVersionTextBox.SetAccessibilityLabelRelationship (packageVersionLabel); + packageVersionLabel, + GettextCatalog.GetString ("Enter the version of the NuGet package")); packageAuthorsTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Authors", - GettextCatalog.GetString ("Authors"), - GettextCatalog.GetString ("Enter the authors of the NuGet package")); - packageAuthorsTextBox.SetAccessibilityLabelRelationship (packageAuthorsLabel); + packageAuthorsLabel, + GettextCatalog.GetString ("Enter the authors of the NuGet package")); packageDescriptionTextView.SetCommonAccessibilityAttributes ("NuGetMetadata.Description", - GettextCatalog.GetString ("Description"), - GettextCatalog.GetString ("Enter the description of the NuGet package")); - packageDescriptionTextView.SetAccessibilityLabelRelationship (packageDescriptionLabel); + packageDescriptionLabel, + GettextCatalog.GetString ("Enter the description of the NuGet package")); packageOwnersTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Owners", - GettextCatalog.GetString ("Owners"), - GettextCatalog.GetString ("Enter the owners of the NuGet package")); - packageOwnersTextBox.SetAccessibilityLabelRelationship (packageOwnersLabel); + packageOwnersLabel, + GettextCatalog.GetString ("Enter the owners of the NuGet package")); packageCopyrightTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Copyright", - GettextCatalog.GetString ("Copyright"), - GettextCatalog.GetString ("Enter the copyright statement for the NuGet package")); - packageCopyrightTextBox.SetAccessibilityLabelRelationship (packageCopyrightLabel); + packageCopyrightLabel, + GettextCatalog.GetString ("Enter the copyright statement for the NuGet package")); packageTitleTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Title", - GettextCatalog.GetString ("Title"), - GettextCatalog.GetString ("Enter the title of the NuGet package")); - packageTitleTextBox.SetAccessibilityLabelRelationship (packageTitleLabel); + packageTitleLabel, + GettextCatalog.GetString ("Enter the title of the NuGet package")); packageSummaryTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Summary", - GettextCatalog.GetString ("Summary"), - GettextCatalog.GetString ("Enter the summary for the NuGet package")); - packageSummaryTextBox.SetAccessibilityLabelRelationship (packageSummaryLabel); + packageSummaryLabel, + GettextCatalog.GetString ("Enter the summary for the NuGet package")); packageProjectUrlTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.URL", - GettextCatalog.GetString ("Project URL"), - GettextCatalog.GetString ("Enter the project URL for the NuGet package")); - packageProjectUrlTextBox.SetAccessibilityLabelRelationship (packageProjectUrlLabel); + packageProjectUrlLabel, + GettextCatalog.GetString ("Enter the project URL for the NuGet package")); packageIconUrlTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Icon", - GettextCatalog.GetString ("Icon URL"), - GettextCatalog.GetString ("Enter the URL for the NuGet package's icon")); - packageIconUrlTextBox.SetAccessibilityLabelRelationship (packageIconUrlLabel); + packageIconUrlLabel, + GettextCatalog.GetString ("Enter the URL for the NuGet package's icon")); packageLicenseUrlTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.licence", - GettextCatalog.GetString ("License URL"), - GettextCatalog.GetString ("Enter the URL for the NuGet package's license")); - packageLicenseUrlTextBox.SetAccessibilityLabelRelationship (packageLicenseUrlLabel); + packageLicenseUrlLabel, + GettextCatalog.GetString ("Enter the URL for the NuGet package's license")); packageRequireLicenseAcceptanceCheckBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Acceptance", - GettextCatalog.GetString ("Require License Acceptance"), - GettextCatalog.GetString ("Check to require the user to accept the NuGet package's license")); - packageRequireLicenseAcceptanceCheckBox.SetAccessibilityLabelRelationship (packageRequireLicenseAcceptanceLabel); + packageRequireLicenseAcceptanceLabel, + GettextCatalog.GetString ("Check to require the user to accept the NuGet package's license")); packageDevelopmentDependencyCheckBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Development", - GettextCatalog.GetString ("Development Dependency"), - GettextCatalog.GetString ("Check to indicate that this is a development dependency")); - packageDevelopmentDependencyCheckBox.SetAccessibilityLabelRelationship (packageDevelopmentDependencyLabel); + packageDevelopmentDependencyLabel, + GettextCatalog.GetString ("Check to indicate that this is a development dependency")); packageTagsTextBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Tags", - GettextCatalog.GetString ("Tags"), - GettextCatalog.GetString ("Enter the tags for this NuGet package")); - packageTagsTextBox.SetAccessibilityLabelRelationship (packageTagsLabel); + packageTagsLabel, + GettextCatalog.GetString ("Enter the tags for this NuGet package")); packageLanguageComboBox.SetCommonAccessibilityAttributes ("NuGetMetadata.Language", - GettextCatalog.GetString ("Language"), - GettextCatalog.GetString ("Select the language for this NuGet package")); - packageLanguageComboBox.SetAccessibilityLabelRelationship (packageLanguageLabel); + packageLanguageLabel, + GettextCatalog.GetString ("Select the language for this NuGet package")); packageReleaseNotesTextView.SetCommonAccessibilityAttributes ("NuGetMetadata.ReleaseNotes", - GettextCatalog.GetString ("Release Notes"), - GettextCatalog.GetString ("Enter the release notes for this NuGet package")); - packageReleaseNotesTextView.SetAccessibilityLabelRelationship (packageReleaseNotesLabel); - + packageReleaseNotesLabel, + GettextCatalog.GetString ("Enter the release notes for this NuGet package")); } internal static System.Action OnProjectHasMetadataChanged; -- cgit v1.2.3 From c33fc7e5d8cd1b31ff75d0081efab12a3bc79c8c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 17 Jan 2019 10:26:25 +0000 Subject: [Packaging] Fix voice over not reading warning label in project options In project options - NuGet Package - Build the check box to enable creation of a NuGet package at build time will show a warning label if there is no associated package metadata defined for the project. This warning label was not being read by voice over when the check box is selected. Now the accessibility text is updated and includes the warning text if it is applies so this is now read by voice over when the check box is selected. Fixes VSTS #753475 - Accessibility: Voice Over is not reading the alert text revealed after the "Create a NuGet Package" checkbox is checked. --- .../GtkProjectNuGetBuildOptionsPanelWidget.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'main/src/addins/MonoDevelop.Packaging') diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs index 3645bd12ac..38468f2f14 100644 --- a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs +++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs @@ -44,9 +44,13 @@ namespace MonoDevelop.Packaging.Gui SetupAccessibility (); } - void SetupAccessibility () + void SetupAccessibility (bool includeMissingMetadataLabelText = false) { - packOnBuildButton.SetCommonAccessibilityAttributes ("NugetBuildOptionsPanel.PackOnBuild", "", + string accessibilityLabel = packOnBuildButton.Label; + if (includeMissingMetadataLabelText) { + accessibilityLabel += " " + missingMetadataLabel.Text; + } + packOnBuildButton.SetCommonAccessibilityAttributes ("NugetBuildOptionsPanel.PackOnBuild", accessibilityLabel, GettextCatalog.GetString ("Check to create a NuGet package when building")); } @@ -73,10 +77,15 @@ namespace MonoDevelop.Packaging.Gui void UpdateMissingMetadataLabelVisibility () { - if (packOnBuildButton.Active) { - missingMetadataLabel.Visible = !ProjectHasMetadata; + bool visible = packOnBuildButton.Active && !ProjectHasMetadata; + missingMetadataLabel.Visible = visible; + + // Refresh accessibility information so missing metadata label text is available to Voice Over + // when the check box is selected. + if (visible) { + SetupAccessibility (includeMissingMetadataLabelText: true); } else { - missingMetadataLabel.Visible = false; + SetupAccessibility (); } } -- cgit v1.2.3