Skip to content

Instantly share code, notes, and snippets.

@neilellis
Created March 15, 2013 18:28
Show Gist options
  • Save neilellis/5171952 to your computer and use it in GitHub Desktop.
Save neilellis/5171952 to your computer and use it in GitHub Desktop.
A GWT menu bar that closes itself if user interaction ceases.
package cazcade.boardcast.client.main.widgets;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author <a href="http://uk.linkedin.com/in/neilellis">Neil Ellis</a>
*/
public class SelfClosingMenuBar extends MenuBar {
public static final int GENERAL_TIMEOUT = 4000;
public static final int PARENT_TIMEOUT = 10000;
public static final int LEAF_OUT_TIMEOUT = 500;
private static final Map<MenuBar, Timer> timers = new HashMap<MenuBar, Timer>();
private final MenuBar root;
private boolean hasSubmenus;
public SelfClosingMenuBar(boolean vertical, MenuBar root) {
super(vertical);
this.root = root;
setAutoOpen(false);
}
@Override protected void onLoad() {
super.onLoad();
if (getClose() == null) {
setClose(new Timer() {
@Override public void run() {
root.closeAllChildren(false);
}
});
}
List<MenuItem> items = getItems();
for (MenuItem item : items) {
if (item.getSubMenu() != null) {
hasSubmenus = true;
}
}
if (!hasSubmenus) {
startCloseTimer(GENERAL_TIMEOUT);
}
}
@Override public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
cancelCloseTimer();
if (event.getType().equals(MouseOutEvent.getType().getName()) && !hasSubmenus) {
startCloseTimer(LEAF_OUT_TIMEOUT);
} else {
startCloseTimer(hasSubmenus ? PARENT_TIMEOUT : GENERAL_TIMEOUT);
}
ClientLog.log(event.getType());
}
private void cancelCloseTimer() {
getClose().cancel();
}
private void startCloseTimer(int delayMillis) {
getClose().schedule(delayMillis);
}
public Timer getClose() {
return timers.get(root);
}
public void setClose(Timer close) {
timers.put(root, close);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment