/*
* Copyright 2000-2016 Vaadin Ltd.
*
* 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.
*/
package com.vaadin.client.ui.loginform;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.FormPanel;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorHierarchyChangeEvent;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.AbstractSingleComponentContainerConnector;
import com.vaadin.client.ui.VTextField;
import com.vaadin.client.ui.button.ButtonConnector;
import com.vaadin.client.ui.nativebutton.NativeButtonConnector;
import com.vaadin.client.ui.textfield.TextFieldConnector;
import com.vaadin.shared.Connector;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.loginform.LoginFormConstants;
import com.vaadin.shared.ui.loginform.LoginFormRpc;
import com.vaadin.shared.ui.loginform.LoginFormState;
@Connect(com.vaadin.ui.LoginForm.class)
public class LoginFormConnector
extends AbstractSingleComponentContainerConnector {
private LoginFormRpc loginFormRpc;
@Override
public void updateCaption(ComponentConnector connector) {
}
@Override
public VLoginForm getWidget() {
return (VLoginForm) super.getWidget();
}
@Override
protected void init() {
super.init();
loginFormRpc = getRpcProxy(LoginFormRpc.class);
getWidget().addSubmitCompleteHandler(
new FormPanel.SubmitCompleteHandler() {
@Override
public void onSubmitComplete(
FormPanel.SubmitCompleteEvent event) {
valuesChanged();
loginFormRpc.submitCompleted();
}
});
}
@Override
public LoginFormState getState() {
return (LoginFormState) super.getState();
}
@Override
public void onConnectorHierarchyChange(
ConnectorHierarchyChangeEvent event) {
ComponentConnector content = getContent();
if (content != null) {
getWidget().setWidget(getContentWidget());
}
}
@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
super.onStateChanged(stateChangeEvent);
LoginFormState state = getState();
configureTextField(getUsernameFieldConnector(), "username");
configureTextField(getPasswordFieldConnector(), "password");
addSubmitButtonClickHandler(state.loginButtonConnector);
getWidget().setAction(
getResourceUrl(LoginFormConstants.LOGIN_RESOURCE_NAME));
}
private TextFieldConnector getUsernameFieldConnector() {
return (TextFieldConnector) getState().userNameFieldConnector;
}
private TextFieldConnector getPasswordFieldConnector() {
return (TextFieldConnector) getState().passwordFieldConnector;
}
private VTextField configureTextField(TextFieldConnector connector,
String id) {
if (connector != null) {
VTextField textField = connector.getWidget();
textField.addKeyDownHandler(new SubmitKeyHandler());
Element element = textField.getElement();
String externalId = element.getId();
if (externalId == null || externalId.isEmpty()
|| externalId.startsWith("gwt-")) {
element.setId(id);
}
DOM.setElementAttribute(element, "name", id);
DOM.setElementAttribute(element, "autocomplete", "on");
return textField;
} else {
return null;
}
}
private void loginLater() {
Scheduler.get().scheduleFixedDelay(new Scheduler.RepeatingCommand() {
@Override
public boolean execute() {
login();
return false;
}
}, 100);
}
private void login() {
getWidget().submit();
}
private void addSubmitButtonClickHandler(Connector buttonConnector) {
if (buttonConnector instanceof ButtonConnector) {
addSubmitButtonClickHandler(
((ButtonConnector) buttonConnector).getWidget());
} else if (buttonConnector instanceof NativeButtonConnector) {
addSubmitButtonClickHandler(
((NativeButtonConnector) buttonConnector).getWidget());
}
}
private void addSubmitButtonClickHandler(FocusWidget button) {
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
login();
}
});
}
private void valuesChanged() {
TextFieldConnector connector = getUsernameFieldConnector();
if (connector != null) {
connector.flush();
}
connector = getPasswordFieldConnector();
if (connector != null) {
connector.flush();
}
}
private class SubmitKeyHandler implements KeyDownHandler {
private int previousKeyCode;
@Override
public void onKeyDown(KeyDownEvent event) {
int keyCode = event.getNativeKeyCode();
if (keyCode == KeyCodes.KEY_ENTER) {
if (isInAutoComplete()) {
previousKeyCode = keyCode;
} else {
loginLater();
}
} else {
previousKeyCode = keyCode;
}
}
private boolean isInAutoComplete() {
switch (previousKeyCode) {
case KeyCodes.KEY_PAGEUP:
case KeyCodes.KEY_PAGEDOWN:
case KeyCodes.KEY_UP:
case KeyCodes.KEY_DOWN:
return true;
default:
return false;
}
}
}
}