package com.eas.widgets.boxes; import com.eas.ui.HasImageParagraph; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.HasAllMouseHandlers; import com.google.gwt.event.dom.client.HasAllTouchHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.dom.client.HasDoubleClickHandlers; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.HasHTML; import com.google.gwt.user.client.ui.HasText; public class ImageParagraph extends FocusWidget implements HasText, HasHTML, HasClickHandlers, HasDoubleClickHandlers, Focusable, HasEnabled, HasAllMouseHandlers, HasAllTouchHandlers, HasImageParagraph { // forms api protected String text; protected boolean html; protected int horizontalTextPosition = RIGHT; protected int verticalTextPosition = CENTER; protected int iconTextGap = 4; protected int horizontalAlignment = LEFT; protected int verticalAlignment = CENTER; protected ImageResource image; protected Element container; protected Element content; protected Element aligner; // protected ImageParagraph(Element aContainer, String aTitle, boolean asHtml) { this(aContainer, aTitle, asHtml, null); } protected ImageParagraph(Element aContainer, String aTitle, boolean asHtml, ImageResource aImage) { super(); text = aTitle; html = asHtml; image = aImage; container = aContainer; container.getStyle().setPosition(Style.Position.RELATIVE); container.getStyle().setDisplay(Style.Display.INLINE_BLOCK); container.getStyle().setPadding(0, Unit.PX); // content = Document.get().createPElement(); content.getStyle().setMargin(0, Unit.PX); content.getStyle().setPosition(Style.Position.RELATIVE); content.getStyle().setDisplay(Style.Display.INLINE_BLOCK); aligner = Document.get().createDivElement(); aligner.getStyle().setDisplay(Style.Display.INLINE_BLOCK); aligner.getStyle().setPosition(Style.Position.RELATIVE); aligner.getStyle().setHeight(100, Style.Unit.PCT); aligner.getStyle().setVerticalAlign(Style.VerticalAlign.MIDDLE); aligner.getStyle().setVisibility(Style.Visibility.HIDDEN); // container.insertFirst(content); container.insertAfter(aligner, content);// aligner must go after content // because of Gecko's craziness. setElement(container); } @Override public ImageResource getImageResource() { return image; } private void organize() { if (isAttached()) { //final Style contentStyle = content.getStyle(); organizeText(); organizeImage(); /* if (isAttached() && (getParent() instanceof FlowPanel || getParent() instanceof RootPanel || getParent() instanceof ScrollPanel)) { contentStyle.setPosition(Style.Position.RELATIVE); } else { contentStyle.setPosition(Style.Position.ABSOLUTE); } */ organizeHorizontalAlignment(); organizeVerticalAlignment(); } } protected void organizeHorizontalAlignment() { final Style containerStyle = container.getStyle(); final Style contentStyle = content.getStyle(); switch (horizontalAlignment) { case LEFT: case LEADING: contentStyle.setLeft(0, Unit.PX); contentStyle.clearRight(); contentStyle.setTextAlign(Style.TextAlign.LEFT); containerStyle.setTextAlign(Style.TextAlign.LEFT); break; case RIGHT: case TRAILING: contentStyle.clearLeft(); contentStyle.setRight(0, Unit.PX); contentStyle.setTextAlign(Style.TextAlign.RIGHT); containerStyle.setTextAlign(Style.TextAlign.RIGHT); break; case CENTER: // contentStyle.setLeft(0, Style.Unit.PX); // contentStyle.setRight(0, Style.Unit.PX); contentStyle.setTextAlign(Style.TextAlign.CENTER); containerStyle.setTextAlign(Style.TextAlign.CENTER); break; } } protected void organizeVerticalAlignment() { final Style contentStyle = content.getStyle(); final Style alignerStyle = aligner.getStyle(); switch (verticalAlignment) { case TOP: contentStyle.setVerticalAlign(Style.VerticalAlign.TOP); break; case BOTTOM: { contentStyle.setVerticalAlign(Style.VerticalAlign.BOTTOM); break; } case CENTER: { contentStyle.setVerticalAlign(Style.VerticalAlign.MIDDLE); break; } } } protected void organizeText() { if (html) { content.setInnerHTML(text != null ? text : ""); } else { content.setInnerText(text != null ? text : ""); } } protected void organizeImage() { Style contentStyle = content.getStyle(); contentStyle.setProperty("background", ""); contentStyle.clearPaddingLeft(); contentStyle.clearPaddingRight(); contentStyle.clearPaddingTop(); contentStyle.clearPaddingBottom(); int textGap = text != null && !text.isEmpty() ? iconTextGap : 0; if (image != null) { String backgroundPosition; if (horizontalTextPosition == LEFT || horizontalTextPosition == LEADING) { backgroundPosition = "right"; contentStyle.setPaddingLeft(0, Style.Unit.PX); contentStyle.setPaddingRight(textGap + image.getWidth(), Style.Unit.PX); } else if (horizontalTextPosition == RIGHT || horizontalTextPosition == TRAILING) { backgroundPosition = "left"; contentStyle.setPaddingLeft(textGap + image.getWidth(), Style.Unit.PX); contentStyle.setPaddingRight(0, Style.Unit.PX); } else { if (text == null || text.isEmpty()) { int imageWidth = image.getWidth(); contentStyle.setPaddingLeft(imageWidth / 2, Style.Unit.PX); contentStyle.setPaddingRight(imageWidth / 2, Style.Unit.PX); } backgroundPosition = "center"; } backgroundPosition += " "; if (verticalTextPosition == TOP || verticalTextPosition == LEADING) { backgroundPosition += "bottom"; contentStyle.setPaddingTop(0, Style.Unit.PX); contentStyle.setPaddingBottom(textGap + image.getHeight(), Style.Unit.PX); } else if (verticalTextPosition == BOTTOM || verticalTextPosition == TRAILING) { backgroundPosition += "top"; contentStyle.setPaddingTop(textGap + image.getHeight(), Style.Unit.PX); contentStyle.setPaddingBottom(0, Style.Unit.PX); } else { if (text == null || text.isEmpty()) { int imageHeight = image.getHeight(); contentStyle.setPaddingTop(imageHeight / 2, Style.Unit.PX); contentStyle.setPaddingBottom(imageHeight / 2, Style.Unit.PX); } backgroundPosition += "center"; } contentStyle.setProperty("background", "url(" + image.getSafeUri().asString() + ")" + " no-repeat " + backgroundPosition); } } public int getVerticalAlignment() { return verticalAlignment; } public void setVerticalAlignment(int aValue) { if (verticalAlignment != aValue) { verticalAlignment = aValue; organize(); } } public int getHorizontalAlignment() { return horizontalAlignment; } public void setHorizontalAlignment(int aValue) { if (horizontalAlignment != aValue) { horizontalAlignment = aValue; organize(); } } @Override public String getText() { return !html ? text : null; } @Override public void setText(String aValue) { html = false; text = aValue; organize(); } @Override public String getHTML() { return html ? text : null; } @Override public void setHTML(String aValue) { html = true; text = aValue; organize(); } public int getIconTextGap() { return iconTextGap; } public void setIconTextGap(int aValue) { if (iconTextGap != aValue) { iconTextGap = aValue; organize(); } } public int getHorizontalTextPosition() { return horizontalTextPosition; } public void setHorizontalTextPosition(int aValue) { if (horizontalTextPosition != aValue) { horizontalTextPosition = aValue; organize(); } } public int getVerticalTextPosition() { return verticalTextPosition; } public void setVerticalTextPosition(int aValue) { if (verticalTextPosition != aValue) { verticalTextPosition = aValue; organize(); } } @Override public void setImageResource(ImageResource aValue) { image = aValue; organize(); } @Override protected void onAttach() { super.onAttach(); organize(); } @Override protected void onDetach() { super.onDetach(); } }