Skip to content

Commit

Permalink
make min/max/restore quadrant controls fully accessible
Browse files Browse the repository at this point in the history
- the controls to the right of tabs for minimizing, maximizing, and restoring each quadrant can now be operated by screen reader and/or keyboard, and report distinctive names indicating both which quadrant they are in, and their current state (min/max/restore)
- also gave each a unique, stable elementId
  • Loading branch information
gtritchie committed Jan 10, 2020
1 parent 4f4ed2b commit 54cf00b
Show file tree
Hide file tree
Showing 8 changed files with 248 additions and 81 deletions.
6 changes: 6 additions & 0 deletions src/gwt/src/org/rstudio/core/client/ElementIds.java
Original file line number Diff line number Diff line change
Expand Up @@ -442,4 +442,10 @@ public String toString()
public final static String RSC_ACCOUNT_LIST = "rsc_account_list";
public static String getRscAccountList() { return getElementId(RSC_ACCOUNT_LIST); }
public final static String RSC_FILES_LIST_LABEL = "rsc_files_list_label";

// WindowFrameButton (combined with unique suffix for each quadrant
public final static String FRAME_MIN_BTN = "frame_min_btn";
public final static String FRAME_MAX_BTN = "frame_max_btn";
public final static String MIN_FRAME_MIN_BTN = "min_frame_min_btn";
public final static String MIN_FRAME_MAX_BTN = "min_frame_max_btn";
}
14 changes: 3 additions & 11 deletions src/gwt/src/org/rstudio/core/client/layout/LogicalWindow.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* LogicalWindow.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
* Copyright (C) 2009-20 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
Expand Down Expand Up @@ -104,16 +104,8 @@ public void onWindowStateChange(WindowStateChangeEvent event)

public void transitionToState(WindowState newState)
{
if (newState == MAXIMIZE)
normal_.addStyleDependentName("maximized");
else
normal_.removeStyleDependentName("maximized");

if (newState == EXCLUSIVE)
normal_.addStyleDependentName("exclusive");
else
normal_.removeStyleDependentName("exclusive");

normal_.setMaximizedDependentState(newState);
normal_.setExclusiveDependentState(newState);
state_ = newState;

if (getActiveWidget() == normal_)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* MinimizedModuleTabLayoutPanel.java
*
* Copyright (C) 2009-19 by RStudio, Inc.
* Copyright (C) 2009-20 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
Expand Down Expand Up @@ -30,9 +30,9 @@ public class MinimizedModuleTabLayoutPanel
extends MinimizedWindowFrame
implements HasSelectionHandlers<Integer>
{
public MinimizedModuleTabLayoutPanel()
public MinimizedModuleTabLayoutPanel(String accessibleName)
{
super(null, new HorizontalPanel());
super(null, accessibleName, new HorizontalPanel());
addStyleName(ThemeResources.INSTANCE.themeStyles().moduleTabPanel());
addStyleName(ThemeResources.INSTANCE.themeStyles().minimized());
}
Expand Down
37 changes: 15 additions & 22 deletions src/gwt/src/org/rstudio/core/client/theme/MinimizedWindowFrame.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* MinimizedWindowFrame.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
* Copyright (C) 2009-20 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
Expand All @@ -19,6 +19,7 @@
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.*;
import org.rstudio.core.client.ElementIds;
import org.rstudio.core.client.events.HasWindowStateChangeHandlers;
import org.rstudio.core.client.events.WindowStateChangeEvent;
import org.rstudio.core.client.events.WindowStateChangeHandler;
Expand All @@ -43,12 +44,12 @@ public HandlerRegistration addClickHandler(ClickHandler handler)
}
}

public MinimizedWindowFrame(String title)
public MinimizedWindowFrame(String title, String accessibleName)
{
this(title, null);
this(title, accessibleName, null);
}

public MinimizedWindowFrame(String title, Widget extraWidget)
public MinimizedWindowFrame(String title, String accessibleName, Widget extraWidget)
{
ThemeStyles themeStyles = ThemeResources.INSTANCE.themeStyles();

Expand Down Expand Up @@ -87,29 +88,21 @@ public MinimizedWindowFrame(String title, Widget extraWidget)
inner.setCellWidth(extraWidget, "100%");
}

HTML minimize = createDiv(themeStyles.minimize() + " " +
ThemeStyles.INSTANCE.handCursor());
minimize.addClickHandler(new ClickHandler()
WindowFrameButton minimize = new WindowFrameButton(accessibleName, WindowState.NORMAL);
minimize.setElementId(ElementIds.MIN_FRAME_MIN_BTN + "_" + ElementIds.idSafeString(accessibleName));
minimize.setStylePrimaryName(themeStyles.minimize());
minimize.setClickHandler(() ->
{
public void onClick(ClickEvent event)
{
event.preventDefault();
event.stopPropagation();
fireEvent(new WindowStateChangeEvent(WindowState.MINIMIZE));
}
fireEvent(new WindowStateChangeEvent(WindowState.MINIMIZE));
});
inner.add(minimize);

HTML maximize = createDiv(themeStyles.maximize() + " " +
themeStyles.handCursor());
maximize.addClickHandler(new ClickHandler()
WindowFrameButton maximize = new WindowFrameButton(accessibleName, WindowState.MAXIMIZE);
maximize.setElementId(ElementIds.MIN_FRAME_MAX_BTN + "_" + ElementIds.idSafeString(accessibleName));
maximize.setStylePrimaryName(themeStyles.maximize());
maximize.setClickHandler(() ->
{
public void onClick(ClickEvent event)
{
event.preventDefault();
event.stopPropagation();
fireEvent(new WindowStateChangeEvent(WindowState.MAXIMIZE));
}
fireEvent(new WindowStateChangeEvent(WindowState.MAXIMIZE));
});
inner.add(maximize);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* PrimaryWindowFrame.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
* Copyright (C) 2009-20 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
Expand Down Expand Up @@ -45,6 +45,7 @@ public HandlerRegistration addMouseDownHandler(MouseDownHandler handler)
public PrimaryWindowFrame(String title,
Widget mainWidget)
{
super(title);
ThemeStyles styles = ThemeResources.INSTANCE.themeStyles();

panel_ = new ClickFlowPanel();
Expand Down
85 changes: 48 additions & 37 deletions src/gwt/src/org/rstudio/core/client/theme/WindowFrame.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* WindowFrame.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
* Copyright (C) 2009-20 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
Expand All @@ -17,14 +17,13 @@
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.*;
import com.google.inject.Inject;

import java.util.HashMap;

import org.rstudio.core.client.ElementIds;
import org.rstudio.core.client.events.*;
import org.rstudio.core.client.layout.RequiresVisibilityChanged;
import org.rstudio.core.client.layout.WindowState;
Expand All @@ -42,13 +41,13 @@ public class WindowFrame extends Composite
EnsureVisibleHandler,
EnsureHeightHandler
{
public WindowFrame(Widget mainWidget)
public WindowFrame(Widget mainWidget, String name)
{
this();
this(name);
setMainWidget(mainWidget);
}

public WindowFrame()
public WindowFrame(String name)
{
RStudioGinjector.INSTANCE.injectMembers(this);

Expand All @@ -60,27 +59,15 @@ public WindowFrame()
borderPositioner_ = new SimplePanel();
borderPositioner_.add(border_);

HTML maximize = new HTML();
maximize.setStylePrimaryName(styles.maximize());
maximize.addStyleName(ThemeStyles.INSTANCE.handCursor());
maximize.addClickHandler(new ClickHandler()
{
public void onClick(ClickEvent event)
{
maximize();
}
});
maximizeButton_ = new WindowFrameButton(name, WindowState.MAXIMIZE);
maximizeButton_.setElementId(ElementIds.FRAME_MAX_BTN + "_" + ElementIds.idSafeString(name));
maximizeButton_.setStylePrimaryName(styles.maximize());
maximizeButton_.setClickHandler(() -> maximize());

HTML minimize = new HTML();
minimize.setStylePrimaryName(styles.minimize());
minimize.addStyleName(ThemeStyles.INSTANCE.handCursor());
minimize.addClickHandler(new ClickHandler()
{
public void onClick(ClickEvent event)
{
minimize();
}
});
minimizeButton_ = new WindowFrameButton(name, WindowState.MINIMIZE);
minimizeButton_.setElementId(ElementIds.FRAME_MIN_BTN + "_" + ElementIds.idSafeString(name));
minimizeButton_.setStylePrimaryName(styles.minimize());
minimizeButton_.setClickHandler(() -> minimize());

frame_ = new LayoutPanel();
frame_.setStylePrimaryName(styles.windowframe());
Expand All @@ -92,22 +79,22 @@ public void onClick(ClickEvent event)
frame_.setWidgetLeftRight(borderPositioner_, 0, Style.Unit.PX,
0, Style.Unit.PX);

frame_.add(maximize);
frame_.setWidgetTopHeight(maximize,
frame_.add(minimizeButton_);
frame_.setWidgetTopHeight(minimizeButton_,
ShadowBorder.TOP_SHADOW_WIDTH + 4, Style.Unit.PX,
14, Style.Unit.PX);
frame_.setWidgetRightWidth(minimizeButton_,
ShadowBorder.RIGHT_SHADOW_WIDTH + 25, Style.Unit.PX,
14, Style.Unit.PX);

frame_.add(maximizeButton_);
frame_.setWidgetTopHeight(maximizeButton_,
ShadowBorder.TOP_SHADOW_WIDTH + 4, Style.Unit.PX,
14, Style.Unit.PX);
frame_.setWidgetRightWidth(maximize,
frame_.setWidgetRightWidth(maximizeButton_,
ShadowBorder.RIGHT_SHADOW_WIDTH + 7, Style.Unit.PX,
14, Style.Unit.PX);

frame_.add(minimize);
frame_.setWidgetTopHeight(minimize,
ShadowBorder.TOP_SHADOW_WIDTH + 4, Style.Unit.PX,
14, Style.Unit.PX);
frame_.setWidgetRightWidth(minimize,
ShadowBorder.RIGHT_SHADOW_WIDTH + 25, Style.Unit.PX,
14, Style.Unit.PX);

buttonsArea_ = new FlowPanel();
frame_.add(buttonsArea_);

Expand Down Expand Up @@ -372,9 +359,33 @@ public Widget getFillWidget()
return fill_;
}

public void setMaximizedDependentState(WindowState state)
{
if (state == WindowState.MAXIMIZE)
{
addStyleDependentName("maximized");
}
else
{
removeStyleDependentName("maximized");
}
maximizeButton_.setMaximized(state == WindowState.MAXIMIZE);
}

public void setExclusiveDependentState(WindowState state)
{
if (state == WindowState.EXCLUSIVE)
addStyleDependentName("exclusive");
else
removeStyleDependentName("exclusive");
maximizeButton_.setExclusive(state == WindowState.EXCLUSIVE);
}

private final LayoutPanel frame_;
private final ShadowBorder border_;
private final SimplePanel borderPositioner_;
private final WindowFrameButton maximizeButton_;
private final WindowFrameButton minimizeButton_;
private Widget main_;
private Widget header_;
private Widget fill_;
Expand Down
Loading

0 comments on commit 54cf00b

Please sign in to comment.