/*
* AceKeyboardPreviewer.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.studio.client.workbench.views.source.editors.text;
import java.util.ArrayList;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.NativeEvent;
import org.rstudio.studio.client.workbench.views.console.shell.assist.CompletionManager;
import org.rstudio.studio.client.workbench.views.source.editors.text.ace.KeyboardHandler;
public class AceKeyboardPreviewer
{
public interface Handler
{
boolean previewKeyDown(JavaScriptObject data, NativeEvent event) ;
boolean previewKeyPress(JavaScriptObject data, char charCode) ;
}
public AceKeyboardPreviewer(final CompletionManager completionManager)
{
addHandler(new Handler() {
@Override
public boolean previewKeyDown(JavaScriptObject data, NativeEvent event)
{
return completionManager.previewKeyDown(event);
}
@Override
public boolean previewKeyPress(JavaScriptObject data, char charCode)
{
return completionManager.previewKeyPress(charCode);
}
});
}
public void addHandler(Handler handler)
{
handlers_.add(handler);
}
public native final KeyboardHandler getKeyboardHandler() /*-{
var event = $wnd.require("ace/lib/event");
var self = this;
var noop = {command: "null"};
return {
handleKeyboard: $entry(function(data, hashId, keyOrText, keyCode, e) {
if (hashId != -1 || keyCode) {
if (self.@org.rstudio.studio.client.workbench.views.source.editors.text.AceKeyboardPreviewer::onKeyDown(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/dom/client/NativeEvent;)(data, e)) {
event.stopEvent(e);
return noop; // perform a no-op
}
else
return false; // allow default behavior
}
else {
if (self.@org.rstudio.studio.client.workbench.views.source.editors.text.AceKeyboardPreviewer::onTextInput(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;)(data, keyOrText))
return noop;
else
return false;
}
})
};
}-*/;
private boolean onKeyDown(JavaScriptObject data, NativeEvent e)
{
for (Handler handler : handlers_)
{
if (handler.previewKeyDown(data, e))
return true;
}
return false;
}
private boolean onTextInput(JavaScriptObject data, String text)
{
if (text == null)
return false;
// Escape key comes in as a character on desktop builds
if (text.equals("\u001B"))
return true;
for (Handler handler : handlers_)
{
for (int i = 0; i < text.length(); i++)
if (handler.previewKeyPress(data, text.charAt(i)))
return true;
}
return false;
}
private ArrayList<Handler> handlers_ = new ArrayList<Handler>();
}