/*
* ShortcutViewer.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.core.client.command;
import org.rstudio.core.client.widget.ShortcutInfoPanel;
import org.rstudio.core.client.widget.VimKeyInfoPanel;
import org.rstudio.studio.client.application.Desktop;
import org.rstudio.studio.client.common.GlobalDisplay;
import org.rstudio.studio.client.workbench.commands.Commands;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.Event.NativePreviewHandler;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class ShortcutViewer implements NativePreviewHandler
{
public interface Binder extends CommandBinder<Commands, ShortcutViewer> {}
@Inject
public ShortcutViewer(
Binder binder,
Commands commands,
GlobalDisplay globalDisplay)
{
binder.bind(commands, this);
globalDisplay_ = globalDisplay;
}
@Handler
public void onHelpKeyboardShortcuts()
{
// prevent reentry
if (shortcutInfo_ != null)
{
return;
}
showShortcutInfoPanel(new ShortcutInfoPanel(new Command()
{
@Override
public void execute()
{
if (Desktop.isDesktop())
Desktop.getFrame().showKeyboardShortcutHelp();
else
openApplicationURL("docs/keyboard.htm");
}
}));
}
public void showVimKeyboardShortcuts()
{
// prevent reentry
if (shortcutInfo_ != null)
{
return;
}
showShortcutInfoPanel(new VimKeyInfoPanel());
}
private void showShortcutInfoPanel(ShortcutInfoPanel panel)
{
shortcutInfo_ = panel;
RootLayoutPanel.get().add(shortcutInfo_);
preview_ = Event.addNativePreviewHandler(this);
}
@Override
public void onPreviewNativeEvent(NativePreviewEvent event)
{
if (event.isCanceled())
return;
if (event.getTypeInt() == Event.ONKEYDOWN ||
event.getTypeInt() == Event.ONMOUSEDOWN)
{
if (event.getTypeInt() == Event.ONMOUSEDOWN &&
event.getNativeEvent().getButton() == NativeEvent.BUTTON_RIGHT)
return;
// Don't dismiss the dialog if the click is targeted for a child
// of the shortcut info panel's root element
EventTarget et = event.getNativeEvent().getEventTarget();
if (Element.is(et) && event.getTypeInt() == Event.ONMOUSEDOWN)
{
Element e = Element.as(et);
while (e != null)
{
if (e == shortcutInfo_.getRootElement())
return;
e = e.getParentElement();
}
}
// This is a keystroke or a click outside the panel; dismiss the panel
if (shortcutInfo_ != null)
RootLayoutPanel.get().remove(shortcutInfo_);
shortcutInfo_ = null;
if (preview_ != null)
preview_.removeHandler();
preview_ = null;
event.cancel();
}
}
private void openApplicationURL(String relativeURL)
{
String url = GWT.getHostPageBaseURL() + relativeURL;
globalDisplay_.openWindow(url);
}
private ShortcutInfoPanel shortcutInfo_ = null;
private HandlerRegistration preview_;
private GlobalDisplay globalDisplay_;
}