package org.tessell.model.dsl;
import org.tessell.gwt.dom.client.IsElement;
import org.tessell.gwt.user.client.ui.HasCss;
import org.tessell.gwt.user.client.ui.IsImage;
import org.tessell.gwt.user.client.ui.IsWidget;
import org.tessell.widgets.HasEnsureDebugIdSuffix;
import com.google.gwt.user.client.TakesValue;
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.HasText;
/**
* Utility methods to create {@link TakesValue} wrappers around common properties of widgets.
*
* Tangentially, I think this is reimplementing editors, sans magic, and sans cool features like nesting.
*/
public class TakesValues {
public static TakesValue<String> textOf(final HasText target) {
return new TakesValue<String>() {
@Override
public String getValue() {
return target.getText();
}
@Override
public void setValue(String value) {
target.setText(value);
}
};
}
public static TakesValue<String> textOf(final IsElement target) {
return new TakesValue<String>() {
@Override
public String getValue() {
return target.getInnerText();
}
@Override
public void setValue(String value) {
target.setInnerText(value);
}
};
}
public static TakesValue<String> innerTextOf(final IsWidget target) {
return new TakesValue<String>() {
@Override
public String getValue() {
return target.getIsElement().getInnerText();
}
@Override
public void setValue(String value) {
target.getIsElement().setInnerText(value);
}
};
}
public static TakesValue<String> htmlOf(final HasHTML target) {
return new TakesValue<String>() {
@Override
public String getValue() {
return target.getHTML();
}
@Override
public void setValue(String value) {
target.setHTML(value);
}
};
}
public static TakesValue<String> htmlOf(final IsElement target) {
return new TakesValue<String>() {
@Override
public String getValue() {
return target.getInnerHTML();
}
@Override
public void setValue(String value) {
target.setInnerHTML(value);
}
};
}
public static TakesValue<String> urlOf(final IsImage target) {
return new TakesValue<String>() {
@Override
public String getValue() {
return target.getUrl();
}
@Override
public void setValue(String value) {
target.setUrl(value);
}
};
}
public static TakesValue<String> debugId(final IsWidget w) {
return new TakesValue<String>() {
@Override
public void setValue(String value) {
w.ensureDebugId(value);
}
@Override
public String getValue() {
return w.getIsElement().getAttribute("id");
}
};
}
public static SetsValue<String> debugIdSuffix(final HasEnsureDebugIdSuffix w) {
return new SetsValue<String>() {
@Override
public void setValue(String value) {
w.ensureDebugIdSuffix(value);
}
};
}
public static TakesValue<String> styleOf(final HasCss target) {
return new TakesValue<String>() {
private String lastAddedStyle;
@Override
public String getValue() {
return lastAddedStyle;
}
@Override
public void setValue(String value) {
if (lastAddedStyle != null) {
target.removeStyleName(lastAddedStyle);
lastAddedStyle = null;
}
if (value != null && !"".equals(value)) {
target.addStyleName(value);
lastAddedStyle = value;
}
}
};
}
public static TakesValue<String> attributeOf(final IsElement target, final String attribute) {
return new TakesValue<String>() {
@Override
public String getValue() {
return target.getAttribute(attribute);
}
@Override
public void setValue(final String value) {
target.setAttribute(attribute, value);
}
};
}
}