/* 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 org.activiti.explorer.ui.form;
import java.util.Collection;
import org.activiti.engine.identity.User;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
import org.activiti.explorer.Messages;
import org.activiti.explorer.ui.custom.SelectUsersPopupWindow;
import org.activiti.explorer.ui.event.SubmitEvent;
import org.activiti.explorer.ui.event.SubmitEventListener;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import com.vaadin.data.Property;
import com.vaadin.data.Validator;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Field;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.themes.Reindeer;
/**
* Field which allows you to select a user. The field-value is the
* id of the selected user.
*
* @author Frederik Heremans
*/
public class SelectUserField extends HorizontalLayout implements Field {
private static final long serialVersionUID = 1L;
protected I18nManager i18nManager;
protected TextField wrappedField;
protected Label selectedUserLabel;
protected Button selectUserButton;
protected User selectedUser;
public SelectUserField(String caption) {
i18nManager = ExplorerApp.get().getI18nManager();
setSpacing(true);
setCaption(caption);
selectedUserLabel = new Label();
selectedUserLabel.setValue(i18nManager.getMessage(Messages.FORM_USER_NO_USER_SELECTED));
selectedUserLabel.addStyleName(ExplorerLayout.STYLE_FORM_NO_USER_SELECTED);
addComponent(selectedUserLabel);
selectUserButton = new Button();
selectUserButton.addStyleName(Reindeer.BUTTON_SMALL);
selectUserButton.setCaption(i18nManager.getMessage(Messages.FORM_USER_SELECT));
addComponent(selectUserButton);
selectUserButton.addListener(new ClickListener() {
private static final long serialVersionUID = 1L;
public void buttonClick(ClickEvent event) {
final SelectUsersPopupWindow window = new SelectUsersPopupWindow(
i18nManager.getMessage(Messages.FORM_USER_SELECT), false);
window.addListener(new SubmitEventListener() {
private static final long serialVersionUID = 1L;
@Override
protected void submitted(SubmitEvent event) {
String userId = window.getSelectedUserId();
setValue(userId);
}
@Override
protected void cancelled(SubmitEvent event) {
}
});
ExplorerApp.get().getViewManager().showPopupWindow(window);
}
});
// Invisible textfield, only used as wrapped field
wrappedField = new TextField();
wrappedField.setVisible(false);
addComponent(wrappedField);
}
public boolean isInvalidCommitted() {
return wrappedField.isInvalidCommitted();
}
public void setInvalidCommitted(boolean isCommitted) {
wrappedField.setInvalidCommitted(isCommitted);
}
public void commit() throws SourceException, InvalidValueException {
wrappedField.commit();
}
public void discard() throws SourceException {
wrappedField.discard();
}
public boolean isWriteThrough() {
return wrappedField.isWriteThrough();
}
public void setWriteThrough(boolean writeThrough) throws SourceException, InvalidValueException {
wrappedField.setWriteThrough(true);
}
public boolean isReadThrough() {
return wrappedField.isReadThrough();
}
public void setReadThrough(boolean readThrough) throws SourceException {
wrappedField.setReadThrough(readThrough);
}
public boolean isModified() {
return wrappedField.isModified();
}
public void addValidator(Validator validator) {
wrappedField.addValidator(validator);
}
public void removeValidator(Validator validator) {
wrappedField.removeValidator(validator);
}
public Collection<Validator> getValidators() {
return wrappedField.getValidators();
}
public boolean isValid() {
return wrappedField.isValid();
}
public void validate() throws InvalidValueException {
wrappedField.validate();
}
public boolean isInvalidAllowed() {
return wrappedField.isInvalidAllowed();
}
public void setInvalidAllowed(boolean invalidValueAllowed) throws UnsupportedOperationException {
wrappedField.setInvalidAllowed(invalidValueAllowed);
}
public Object getValue() {
return wrappedField.getValue();
}
public void setValue(Object newValue) throws ReadOnlyException, ConversionException {
wrappedField.setValue(newValue);
// Update label
if(newValue != null) {
if(selectedUser == null || !selectedUser.getId().equals(newValue)) {
// fetch selected user based on id
selectedUser = ExplorerApp.get().getUserCache().findUser((String) newValue);
}
selectedUserLabel.setValue(getSelectedUserLabel());
selectedUserLabel.addStyleName(ExplorerLayout.STYLE_FORM_USER_SELECTED);
selectedUserLabel.removeStyleName(ExplorerLayout.STYLE_FORM_NO_USER_SELECTED);
} else {
selectedUser = null;
selectedUserLabel.setValue(i18nManager.getMessage(Messages.FORM_USER_NO_USER_SELECTED));
selectedUserLabel.addStyleName(ExplorerLayout.STYLE_FORM_NO_USER_SELECTED);
selectedUserLabel.removeStyleName(ExplorerLayout.STYLE_FORM_USER_SELECTED);
}
}
protected Object getSelectedUserLabel() {
if(selectedUser != null) {
return selectedUser.getFirstName() + " " + selectedUser.getLastName();
} else {
return wrappedField.getValue();
}
}
public Class< ? > getType() {
return wrappedField.getType();
}
public void addListener(ValueChangeListener listener) {
wrappedField.addListener(listener);
}
public void removeListener(ValueChangeListener listener) {
wrappedField.removeListener(listener);
}
public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {
wrappedField.valueChange(event);
}
public void setPropertyDataSource(Property newDataSource) {
wrappedField.setPropertyDataSource(newDataSource);
}
public Property getPropertyDataSource() {
return wrappedField.getPropertyDataSource();
}
public int getTabIndex() {
return wrappedField.getTabIndex();
}
public void setTabIndex(int tabIndex) {
wrappedField.setTabIndex(tabIndex);
}
public boolean isRequired() {
return wrappedField.isRequired();
}
public void setRequired(boolean required) {
wrappedField.setRequired(required);
}
public void setRequiredError(String requiredMessage) {
wrappedField.setRequiredError(requiredMessage);
}
public String getRequiredError() {
return wrappedField.getRequiredError();
}
@Override
public void focus() {
wrappedField.focus();
}
}