Skip to content
This repository has been archived by the owner on Oct 4, 2021. It is now read-only.

Commit

Permalink
Merge pull request #8937 from mono/proppy-native-preferences
Browse files Browse the repository at this point in the history
Abstracts IPropertyGrid and uses in Preferences to fix a11c issues
  • Loading branch information
sevoku authored Oct 31, 2019
2 parents 8c555df + a56b550 commit 86136a7
Show file tree
Hide file tree
Showing 17 changed files with 422 additions and 255 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

open Gtk
open MonoDevelop.Core
open MonoDevelop.Components.PropertyGrid
open MonoDevelop.DesignerSupport

// Handwritten GUI, feel free to edit

Expand All @@ -21,7 +21,7 @@ type FSharpFormattingPolicyPanelWidget() =
let mutable hbox2 : Gtk.HBox = null
let mutable vbox4 : Gtk.VBox = null
let mutable tableScopes : Gtk.Table = null
let mutable propertyGrid : PropertyGrid = null
let mutable propertyGrid : PropertyGridWrapper = null

let getName format =
if format = policy.DefaultFormat then
Expand Down Expand Up @@ -125,12 +125,12 @@ type FSharpFormattingPolicyPanelWidget() =
w8.Expand <- false
w8.Fill <- false
// Container child vbox4.Gtk.Box+BoxChild
propertyGrid <- new PropertyGrid()
propertyGrid <- new PropertyGridWrapper ()
propertyGrid.Name <- "propertyGrid"
propertyGrid.ShowToolbar <- false
propertyGrid.ShowHelp <- false
vbox4.Add (propertyGrid)
let w9 = vbox4.[propertyGrid] :?> Gtk.Box.BoxChild
vbox4.Add (propertyGrid.Widget)
let w9 = vbox4.[propertyGrid.Widget] :?> Gtk.Box.BoxChild
w9.Position <- 2
hbox1.Add(vbox4)
let w10 = hbox1.[vbox4] :?> Gtk.Box.BoxChild
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,18 +76,13 @@ NSView GetNextFocusableViewForView (NSView view, int nextPositionInArray = 1)

public void AddViews (params NSView [] views) => viewsKeyLoopOrder.AddRange (views);

public void FocusNextView (NSView view, int nextPositionInArray = 1)
public void RecalculeNextResponderChain ()
{
var window = view?.Window;
if (window == null) {
return;
}
var nextView = GetNextFocusableViewForView (view, nextPositionInArray);
if (nextView != null) {
window.MakeFirstResponder (nextView);
} else {
//in case of no view found we follow the next logical view
window.MakeFirstResponder (nextPositionInArray >= 0 ? view.NextKeyView : view.PreviousKeyView);
NSView currentView = viewsKeyLoopOrder.FirstOrDefault ();
while (currentView != null) {
var nextView = GetNextFocusableViewForView (currentView, 1);
currentView.NextKeyView = nextView;
currentView = nextView;
}
}
}
Expand Down Expand Up @@ -125,15 +120,15 @@ class MacToolbox : NSView, IPropertyPadProvider, IToolboxConfiguration

NSTextField messageTextField;

KeyViewLoopDelegate keyViewLoopDelegate;

readonly KeyViewLoopDelegate keyViewLoopDelegate;
public MacToolbox (ToolboxService toolboxService, IPadWindow container)
{
WantsLayer = true;

keyViewLoopDelegate = new KeyViewLoopDelegate ();

verticalStackView = new NSStackView () {
verticalStackView = new UnfocusableStackView () {
Orientation = NSUserInterfaceLayoutOrientation.Vertical,
Alignment = NSLayoutAttribute.Leading,
Spacing = 0,
Expand Down Expand Up @@ -165,7 +160,6 @@ public MacToolbox (ToolboxService toolboxService, IPadWindow container)
filterEntry.AccessibilityTitle = GettextCatalog.GetString ("Search Toolbox");
filterEntry.AccessibilityHelp = GettextCatalog.GetString ("Enter a term to search for it in the toolbox");
filterEntry.Activated += FilterTextChanged;
filterEntry.CommandRaised += FilterEntry_CommandRaised;

horizontalStackView.AddArrangedSubview (filterEntry);

Expand All @@ -178,8 +172,7 @@ public MacToolbox (ToolboxService toolboxService, IPadWindow container)
catToggleButton.ToolTip = GettextCatalog.GetString ("Show categories");
catToggleButton.AccessibilityHelp = GettextCatalog.GetString ("Toggle to show categories");
catToggleButton.Activated += ToggleCategorisation;
catToggleButton.KeyDownPressed += OnKeyDownKeyLoop;


horizontalStackView.AddArrangedSubview (catToggleButton);

catToggleButton.SetContentCompressionResistancePriority ((int)NSLayoutPriority.DefaultHigh, NSLayoutConstraintOrientation.Horizontal);
Expand All @@ -191,8 +184,6 @@ public MacToolbox (ToolboxService toolboxService, IPadWindow container)
compactModeToggleButton.AccessibilityTitle = GettextCatalog.GetString ("Compact Layout");
compactModeToggleButton.AccessibilityHelp = GettextCatalog.GetString ("Toggle for toolbox to use compact layout");
compactModeToggleButton.Activated += ToggleCompactMode;
compactModeToggleButton.KeyDownPressed += OnKeyDownKeyLoop;


horizontalStackView.AddArrangedSubview (compactModeToggleButton);

Expand All @@ -205,7 +196,6 @@ public MacToolbox (ToolboxService toolboxService, IPadWindow container)
toolboxAddButton.AccessibilityHelp = GettextCatalog.GetString ("Add toolbox items");
toolboxAddButton.ToolTip = GettextCatalog.GetString ("Add toolbox items");
toolboxAddButton.Activated += ToolboxAddButton_Clicked;
toolboxAddButton.KeyDownPressed += OnKeyDownKeyLoop;

horizontalStackView.AddArrangedSubview (toolboxAddButton);

Expand All @@ -218,7 +208,7 @@ public MacToolbox (ToolboxService toolboxService, IPadWindow container)
AccessibilityTitle = GettextCatalog.GetString ("Toolbox Toolbar"),
};

var scrollView = new NSScrollView () {
var scrollView = new UnfocusableScrollview () {
HasVerticalScroller = true,
HasHorizontalScroller = false,
DocumentView = toolboxWidget
Expand Down Expand Up @@ -261,43 +251,9 @@ public MacToolbox (ToolboxService toolboxService, IPadWindow container)
AddSubview (messageTextField);

keyViewLoopDelegate.AddViews (filterEntry, catToggleButton, compactModeToggleButton, toolboxAddButton, toolboxWidget);
keyViewLoopDelegate.RecalculeNextResponderChain ();
}

#region InternalKeyLoop

private void FilterEntry_CommandRaised (object sender, NativeViews.SearchTextFieldCommand e)
{
switch (e) {
case NativeViews.SearchTextFieldCommand.InsertBacktab:
keyViewLoopDelegate.FocusNextView ((NSView)sender, -1);
break;
case NativeViews.SearchTextFieldCommand.InsertTab:
keyViewLoopDelegate.FocusNextView ((NSView)sender, 1);
break;
}
}

private void OnKeyDownKeyLoop (object sender, NativeViews.NSEventArgs args)
{
if (sender is NSView view && keyViewLoopDelegate.Contains (view)) {
if (args.Event.KeyCode == (int)KeyCodes.Tab) {

if ((int)args.Event.ModifierFlags == (int)KeyModifierFlag.None) {
keyViewLoopDelegate.FocusNextView (view, 1);
args.Handled = true;
return;
}
if ((int)args.Event.ModifierFlags == (int)KeyModifierFlag.Shift) {
keyViewLoopDelegate.FocusNextView (view, -1);
args.Handled = true;
return;
}
}
}
}

#endregion

NSIndexPath GetFirstVisibleItemIndexPath ()
{
for (int i = 0; i < toolboxWidget.CategoryVisibilities.Count; i++) {
Expand All @@ -323,7 +279,6 @@ private void ToolboxWidget_KeyDownPressed (object sender, NativeViews.NSEventArg
return;
}
}
OnKeyDownKeyLoop (sender, args);
}

void SetCustomMessage (string value)
Expand Down Expand Up @@ -482,7 +437,6 @@ internal void OnUpdateDeleteItem (CommandInfo info)

#region GUI population

readonly List<ToolboxWidgetCategory> items = new List<ToolboxWidgetCategory> ();
Dictionary<string, ToolboxWidgetCategory> categories = new Dictionary<string, ToolboxWidgetCategory> ();

void AddItems (IEnumerable<ItemToolboxNode> nodes)
Expand Down Expand Up @@ -534,6 +488,7 @@ public void Refresh ()

compactModeToggleButton.Hidden = !toolboxWidget.CanIconizeToolboxCategories;
compactModeToggleButton.InvalidateIntrinsicContentSize ();
keyViewLoopDelegate.RecalculeNextResponderChain ();

if (categories.Count == 0) {
SetCustomMessage (GettextCatalog.GetString ("There are no tools available for the current document."));
Expand All @@ -553,22 +508,13 @@ protected override void Dispose (bool disposing)
if (disposing) {
filterEntry.Activated -= FilterTextChanged;

filterEntry.CommandRaised -= FilterEntry_CommandRaised;

catToggleButton.Activated -= ToggleCategorisation;
catToggleButton.KeyDownPressed -= OnKeyDownKeyLoop;

compactModeToggleButton.Activated -= ToggleCompactMode;
compactModeToggleButton.KeyDownPressed -= OnKeyDownKeyLoop;

toolboxAddButton.Activated -= ToolboxAddButton_Clicked;
toolboxAddButton.KeyDownPressed -= OnKeyDownKeyLoop;

toolboxWidget.ActivateSelectedItem -= ToolboxWidget_ActivateSelectedItem;
toolboxWidget.MenuOpened -= ToolboxWidget_MenuOpened;
toolboxWidget.DragBegin -= ToolboxWidget_DragBegin;
toolboxWidget.RegionCollapsed -= FilterTextChanged;
toolboxWidget.KeyDownPressed -= OnKeyDownKeyLoop;

toolboxService.ToolboxContentsChanged -= ToolboxService_ToolboxContentsChanged;
toolboxService.ToolboxConsumerChanged -= ToolboxService_ToolboxConsumerChanged;
Expand Down Expand Up @@ -614,6 +560,7 @@ public bool AllowEditingComponents {
}
set {
toolboxAddButton.Hidden = !value;
keyViewLoopDelegate.RecalculeNextResponderChain ();
toolboxAddButton.InvalidateIntrinsicContentSize ();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,42 +33,20 @@

namespace MonoDevelop.DesignerSupport.Toolbox.NativeViews
{
enum SearchTextFieldCommand
{
InsertTab,
InsertBacktab
}

class SearchTextField : NSSearchField, INSSearchFieldDelegate
class SearchTextField : NSSearchField
{
public event EventHandler Focused;
public event EventHandler<SearchTextFieldCommand> CommandRaised;

public SearchTextField ()
{
Delegate = this;

}

public override bool BecomeFirstResponder ()
{
Focused?.Invoke (this, EventArgs.Empty);
return base.BecomeFirstResponder ();
}

[Export ("control:textView:doCommandBySelector:")]
bool CommandBySelector (NSControl control, NSTextField field, ObjCRuntime.Selector sel)
{
switch (sel.Name) {
case "insertTab:": // down arrow
CommandRaised?.Invoke (this, SearchTextFieldCommand.InsertTab);
return true;

case "insertBacktab:": // up arrow
CommandRaised?.Invoke (this, SearchTextFieldCommand.InsertBacktab);
return true;
}
return false;
}
}
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ public NSEventArgs (NSEvent nsEvent)

class ToggleButton : NSButton
{
public event EventHandler<NSEventArgs> KeyDownPressed;
public event EventHandler Focused;

public override CGSize IntrinsicContentSize => Hidden ? CGSize.Empty : new CGSize (25, 25);
Expand Down Expand Up @@ -78,12 +77,6 @@ public override void KeyDown (NSEvent theEvent)
if ((int)theEvent.ModifierFlags == (int) KeyModifierFlag.None && (theEvent.KeyCode == (int)KeyCodes.Enter || theEvent.KeyCode == (int)KeyCodes.Space)) {
PerformClick (this);
}

var args = new NSEventArgs (theEvent);
KeyDownPressed?.Invoke (this, args);

if (!args.Handled)
base.KeyDown (theEvent);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace MonoDevelop.DesignerSupport
{
public interface IPropertyPad
public interface IPropertyPad : IDisposable
{
bool IsGridEditing { get; }

Expand Down
Loading

0 comments on commit 86136a7

Please sign in to comment.