Hi All,
i post my complete test app. The test app work nicely but i have problems with the alignment of the TextField inside the custom component.
VaadinComplexFrameApp
package org.is.sample.complex;
import com.vaadin.Application;
import com.vaadin.ui.Window;
public class VaadinComplexFrameApp extends Application {
private static final long serialVersionUID = 6581573252353452472L;
private final Window mainWindow = new Window("VaadinComplexFrameApp");
@Override
public void init() {
ComplexLayout root = new ComplexLayout();
mainWindow.setContent(root);
setMainWindow(mainWindow);
}
}
ComplexLayout panel
package org.is.sample.complex;
import com.vaadin.data.util.BeanItem;
import com.vaadin.ui.Form;
import com.vaadin.ui.Panel;
public class ComplexLayout extends Panel {
private static final long serialVersionUID = -9015184748756501389L;
public ComplexLayout() {
super();
initComponents();
}
private void initComponents() {
Person person = new Person("Jhon", "Smith", 21, "Lincoln Avenue", "1234", "NY");
Form form = getForm(person);
this.addComponent(form);
}
private Form getForm(Person person) {
Form form = new Form();
form.setFormFieldFactory(new MyFormFieldFactory());
form.setCaption("Person");
form.setWidth("400px");
form.setItemDataSource(new BeanItem(person));
form.setVisibleItemProperties(new String[]{"name", "surname", "age"});
form.setImmediate(true);
return form;
}
}
Person bean
package org.is.sample.complex;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -3798892320151628159L;
private String name = "";
private String surname = "";
private int age = -1;
private String address = "";
private String number = "";
private String city = "";
public Person(String name, String surname, int age, String address,
String number, String city) {
super();
this.name = name;
this.surname = surname;
this.age = age;
this.address = address;
this.number = number;
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
MyFormFieldFactory
package org.is.sample.complex;
import java.text.MessageFormat;
import com.vaadin.data.Item;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.DefaultFieldFactory;
import com.vaadin.ui.Field;
import com.vaadin.ui.Form;
import com.vaadin.ui.FormFieldFactory;
import com.vaadin.ui.Button.ClickEvent;
public class MyFormFieldFactory extends DefaultFieldFactory implements FormFieldFactory {
private static final long serialVersionUID = 5845192054295782123L;
public Field createField(Item item, final Object propertyId, Component uiContext) {
Field f;
if ("name".equals(propertyId)) {
f = new ActionTextField("name", "...",
new Button.ClickListener() {
private static final long serialVersionUID = 600786528349423366L;
public void buttonClick(ClickEvent event) {
event.getButton().getApplication().getMainWindow().showNotification(
MessageFormat.format("Button:{0} clicked!", propertyId)
);
}
}
);
}
else {
f = super.createField(item, propertyId, uiContext);
}
f.setParent(((Form)uiContext).getLayout());
f.setWidth("100%");
return f;
}
}
and last but not least the actual custom component
ActionTextField
package org.is.sample.complex;
import java.util.Collection;
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.CustomComponent;
import com.vaadin.ui.Field;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;
public class ActionTextField extends CustomComponent implements Field {
private static final long serialVersionUID = 6116613180668324589L;
private HorizontalLayout layout = new HorizontalLayout();
private TextField field = new TextField();
private Button button = new Button();
private String caption;
public ActionTextField() {
}
public ActionTextField(String caption, String buttonCaption, Button.ClickListener listener) {
super();
super.setWidth(100, UNITS_PERCENTAGE);
layout.setWidth(100, UNITS_PERCENTAGE);
layout.addComponent(field);
this.setCaption(caption);
layout.setComponentAlignment(field, "l");
button.setCaption(buttonCaption);
button.addListener(listener);
layout.addComponent(button);
layout.setComponentAlignment(button, "mr");
layout.setExpandRatio(field, 3);
layout.setSpacing(false);
setCompositionRoot(layout);
}
public ActionTextField(String caption, String value, String buttonCaption, Button.ClickListener listener) {
this(caption, buttonCaption, listener);
this.setValue(value);
}
public String getRequiredError() {
return field.getRequiredError();
}
public boolean isRequired() {
return field.isRequired();
}
public void setRequired(boolean required) {
field.setRequired(required);
}
public void setRequiredError(String requiredMessage) {
field.setRequiredError(requiredMessage);
}
public boolean isInvalidCommitted() {
return field.isInvalidCommitted();
}
public void setInvalidCommitted(boolean isCommitted) {
field.setInvalidCommitted(isCommitted);
}
public void commit() throws SourceException, InvalidValueException {
field.commit();
}
public void discard() throws SourceException {
field.discard();
}
public boolean isModified() {
return field.isModified();
}
public boolean isReadThrough() {
return field.isReadThrough();
}
public boolean isWriteThrough() {
return field.isWriteThrough();
}
public void setReadThrough(boolean readThrough) throws SourceException {
field.setReadThrough(readThrough);
}
public void setWriteThrough(boolean writeThrough) throws SourceException,
InvalidValueException {
field.setWriteThrough(writeThrough);
}
public void addValidator(Validator validator) {
field.addValidator(validator);
}
public Collection<?> getValidators() {
return field.getValidators();
}
public boolean isInvalidAllowed() {
return field.isInvalidAllowed();
}
public boolean isValid() {
return field.isValid();
}
public void removeValidator(Validator validator) {
field.removeValidator(validator);
}
public void setInvalidAllowed(boolean invalidValueAllowed)
throws UnsupportedOperationException {
field.setInvalidAllowed(invalidValueAllowed);
}
public void validate() throws InvalidValueException {
field.validate();
}
public Class<?> getType() {
return field.getType();
}
public void setValue(Object newValue) throws ReadOnlyException,
ConversionException {
field.setValue(newValue);
}
public void addListener(ValueChangeListener listener) {
field.addListener(listener);
}
public void removeListener(ValueChangeListener listener) {
field.removeListener(listener);
}
public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {
field.valueChange(event);
}
public Property getPropertyDataSource() {
return field.getPropertyDataSource();
}
public void setPropertyDataSource(Property newDataSource) {
field.setPropertyDataSource(newDataSource);
}
public void focus() {
field.focus();
}
public int getTabIndex() {
return field.getTabIndex();
}
public void setTabIndex(int tabIndex) {
field.setTabIndex(tabIndex);
}
public Object getValue() {
return field.getValue();
}
public void setCaption(String caption) {
this.caption = caption;
}
public String getCaption() {
return caption;
}
public float getWidth() {
if (layout != null)
return layout.getWidth();
else
return -1;
}
public void setWidth(float width, int unit) {
if (layout != null)
layout.setWidth(width, unit);
}
public void setWidth(String width) {
if (layout != null)
layout.setWidth(width);
}
}
Can anyone give me an hint?
Thank you,
Ivan