package ch.unifr.pai.twice.widgets.client;
/*
* Copyright 2013 Oliver Schmid
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import ch.unifr.pai.twice.comm.serverPush.client.ServerPushEventBus;
import ch.unifr.pai.twice.widgets.client.events.UndoableRemoteKeyPressEvent;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.BorderStyle;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyCodes;
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.Timer;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.web.bindery.event.shared.HandlerRegistration;
public class MyNewTextBox extends AbsolutePanel{
private NativePreviewHandler previewHandler = new Event.NativePreviewHandler() {
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
UndoableRemoteKeyPressEvent e;
if(Event.ONKEYUP == event.getTypeInt()){
switch(event.getNativeEvent().getKeyCode()){
case KeyCodes.KEY_BACKSPACE:
case KeyCodes.KEY_DELETE:
e = GWT.create(UndoableRemoteKeyPressEvent.class);
e.setKeyCode(event.getNativeEvent().getKeyCode());
eventBus.fireEventFromSource(e, source);
break;
case KeyCodes.KEY_LEFT:
e = GWT.create(UndoableRemoteKeyPressEvent.class);
e.setCursorPos(-1);
eventBus.fireEventFromSource(e, source);
break;
case KeyCodes.KEY_RIGHT:
e = GWT.create(UndoableRemoteKeyPressEvent.class);
e.setCursorPos(1);
eventBus.fireEventFromSource(e, source);
break;
}
event.cancel();
}
else if(Event.ONKEYPRESS == event.getTypeInt()){
switch(event.getNativeEvent().getKeyCode()){
case KeyCodes.KEY_BACKSPACE:
case KeyCodes.KEY_LEFT:
case KeyCodes.KEY_RIGHT:
case KeyCodes.KEY_DELETE:
break;
default:
e = GWT.create(UndoableRemoteKeyPressEvent.class);
e.setText(String.valueOf((char)event.getNativeEvent().getCharCode()));
eventBus.fireEventFromSource(e, source);
}
event.cancel();
}
}
};
private HandlerRegistration previewRegistration;
private RemoteTextInputInterpreter interpreter;
private ServerPushEventBus eventBus;
private String source;
private TextBox t = new TextBox();
private Label measurement = new Label();
private Label l2 = new Label();
private HTML cursor = new HTML();
private Timer cursorBlink;
public MyNewTextBox(ServerPushEventBus eventBus, String source){
this.eventBus = eventBus;
this.source = source;
l2.getElement().getStyle().setBorderStyle(BorderStyle.SOLID);
l2.getElement().getStyle().setBorderWidth(1, Unit.PX);
l2.getElement().getStyle().setWidth(100, Unit.PCT);
measurement.getElement().getStyle().setVisibility(Visibility.HIDDEN);
cursor.setHeight("15px");
cursor.getElement().getStyle().setBackgroundColor("black");
// cursor.getElement().getStyle().setBorderStyle(BorderStyle.SOLID);
cursor.setWidth("1px");
cursorBlink = new Timer() {
@Override
public void run() {
if(cursor.getElement().getStyle().getVisibility().equals(Visibility.VISIBLE.getCssName())){
cursor.getElement().getStyle().setVisibility(Visibility.HIDDEN);
}
else{
cursor.getElement().getStyle().setVisibility(Visibility.VISIBLE);
}
}
};
cursor.getElement().getStyle().setVisibility(Visibility.HIDDEN);
this.setWidth("100px");
this.setHeight("120px");
this.add(measurement, 0, 0);
this.add(cursor, 0, 0);
this.add(l2, 0, 0);
this.add(t, 0, 0);
this.interpreter = new RemoteTextInputInterpreter(new Command(){
@Override
public void execute() {
measurement.setText(interpreter.getValue().substring(0, interpreter.getThisCursorPos()));
t.setText(interpreter.getValue());
l2.setText(interpreter.getValue());
MyNewTextBox.this.setWidgetPosition(cursor, measurement.getOffsetWidth(), measurement.getOffsetHeight()-15);
}}, eventBus, source);
t.addFocusHandler(new FocusHandler() {
@Override
public void onFocus(FocusEvent event) {
previewRegistration = Event.addNativePreviewHandler(previewHandler);
t.getElement().getStyle().setVisibility(Visibility.HIDDEN);
cursorBlink.scheduleRepeating(600);
}
});
t.addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
if(previewRegistration!=null){
previewRegistration.removeHandler();
previewRegistration = null;
}
t.getElement().getStyle().setVisibility(Visibility.VISIBLE);
cursor.getElement().getStyle().setVisibility(Visibility.HIDDEN);
cursorBlink.cancel();
}
});
}
}