For my custom buttons i use Flex Table with 1 row and 3 columns: left, repeat and right, where left and right are images with rounded corners and repeat is 1px width image that is repeated.
I also have predefined styles that are placed in enum. The only problem here is that my images are not in bundle, but it can easily be done with bundle. At the and is the css.
Here is an example:
public class ImageButton extends FlexTable {
public enum Style {
HEADER, TABLE_CLOSE;
private static String fromEnum(Style i) {
switch (i) {
case HEADER:
return "header-image-button";
case TABLE_CLOSE:
return "table-close-image-button";
default:
return "header-image-button";
}
}
}
private final HTML left = new HTML();
private final HTML middle = new HTML();
private final HTML right = new HTML();
private final CellFormatter cf = getCellFormatter();
public ImageButton(String title, Style style) {
this(style);
middle.setText(title);
}
public ImageButton(Style style) {
// make all flex table cells like one
this.setBorderWidth(0);
this.setCellPadding(0);
this.setCellSpacing(0);
this.setWidget(0, 0, left);
// cf.setWidth(0, 0, "6px");
this.setWidget(0, 1, middle);
middle.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
cf.setVerticalAlignment(0, 1, HasVerticalAlignment.ALIGN_MIDDLE);
cf.setHorizontalAlignment(0, 1, HasHorizontalAlignment.ALIGN_CENTER);
this.setWidget(0, 2, right);
// cf.setWidth(0, 2, "7px");
setOverridenStyleName(style);
}
private void setOverridenStyleName(Style style) {
super.setStyleName(Style.fromEnum(style));
switch (style) {
case HEADER:
setLeftStyleName("bg-left");
setRightStyleName("bg-right");
setMiddleStyleName("bg-repeat");
break;
case TABLE_CLOSE:
setLeftStyleName("left-table-close-button");
setRightStyleName("right-table-close-button");
setMiddleStyleName("repeat-table-close-button");
break;
}
}
public void setLeftStyleName(String style) {
cf.setStyleName(0, 0, style);
}
public void setMiddleStyleName(String style) {
cf.setStyleName(0, 1, style);
}
public void setRightStyleName(String style) {
cf.setStyleName(0, 2, style);
}
@Override
public void setTitle(String title) {
middle.setText(title);
}
@Override
public String getTitle() {
return middle.getText();
}
public void setEnabled(boolean enabled) {
DOM.setElementPropertyBoolean(getElement(), "disabled", !enabled);
if (enabled) {
this.removeStyleName("disabled-button");
} else {
this.addStyleName("disabled-button");
}
}
public boolean isEnabled() {
return !DOM.getElementPropertyBoolean(getElement(), "disabled");
}
}
CSS:
bg-left {
background-image: url("left.gif");
background-repeat: no-repeat;
}
.bg-repeat {
background-image: url("repeat.gif");
background-repeat: repeat-x;
}
.bg-right {
background-image: url("right.gif");
background-repeat: no-repeat;
}
USE IT:
ImageButton b1 = new ImageButton(Style.HEADER);
Hope this help.