Vojtech Szocs has uploaded a new change for review. Change subject: webadmin,userportal: Support generic TextBoxLabel widget ......................................................................
webadmin,userportal: Support generic TextBoxLabel widget 1. Created TextBoxLabelBase (abstract class) with generic type parameter and common behavior taken from original TextBoxLabel widget 2. Modified TextBoxLabel to extend TextBoxLabelBase<String> with String-specific behavior taken from original TextBoxLabel widget This patch is meant to support creating custom (type-specific) TextBoxLabel widgets to replace any ValueLabel widgets within "General" sub tab views to achieve consistent look & feel. For example, it should allow replacing this: class VersionLabel extends ValueLabel<RpmVersion> ... with this: class VersionTextBoxLabel extends TextBoxLabelBase<RpmVersion> ... Change-Id: I728f7d6fdc74523ac397225c1c5833cb84f6eef9 Signed-off-by: Vojtech Szocs <vsz...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabel.java A frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java 2 files changed, 100 insertions(+), 58 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/89/21289/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabel.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabel.java index 63b6d03..fabf8d0 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabel.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabel.java @@ -1,61 +1,40 @@ package org.ovirt.engine.ui.common.widget.label; +import java.text.ParseException; + import org.ovirt.engine.ui.common.widget.renderer.EmptyValueRenderer; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; -import com.google.gwt.dom.client.NativeEvent; -import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; -import com.google.gwt.event.dom.client.MouseDownEvent; -import com.google.gwt.event.dom.client.MouseDownHandler; -import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.text.shared.Parser; -public class TextBoxLabel extends TextBox { +public class TextBoxLabel extends TextBoxLabelBase<String> { - private boolean handleEmptyValue = false; - private String unAvailablePropertyLabel = ""; //$NON-NLS-1$ - private boolean hasFocus = false; - private String tooltipCaption = null; - - public TextBoxLabel() { - setReadOnly(true); - getElement().getStyle().setBorderWidth(0, Unit.PX); - getElement().getStyle().setWidth(100, Unit.PCT); - addHandlers(); + private static class StringParser implements Parser<String> { + @Override + public String parse(CharSequence text) throws ParseException { + return text.toString(); + } } - protected void addHandlers() { - addDomHandler(new MouseDownHandler() { + private static class StringRenderer extends EmptyValueRenderer<String> { + @Override + public String render(String value) { + String renderedText = super.render(value); + renderedText = renderedText.replace("<", "<"); //$NON-NLS-1$ //$NON-NLS-2$ + return renderedText; + } + } - @Override - public void onMouseDown(MouseDownEvent event) { - if (event.getNativeButton() == NativeEvent.BUTTON_RIGHT) { - setFocus(true); - selectAll(); - } - } + private boolean hasFocus = false; + private String tooltipCaption; - }, MouseDownEvent.getType()); - - addFocusHandler(new FocusHandler() { - - @Override - public void onFocus(FocusEvent event) { - hasFocus = true; - } - }); - - addBlurHandler(new BlurHandler() { - - @Override - public void onBlur(BlurEvent event) { - hasFocus = false; - } - }); + public TextBoxLabel() { + super(new StringRenderer(), new StringParser()); } public TextBoxLabel(String text) { @@ -63,34 +42,54 @@ setText(text); } - public TextBoxLabel(boolean handleEmptyValue, String unAvailablePropertyLabel) { - this(); - this.handleEmptyValue = handleEmptyValue; - this.unAvailablePropertyLabel = unAvailablePropertyLabel; + @Override + protected void addHandlers() { + super.addHandlers(); + + addFocusHandler(new FocusHandler() { + @Override + public void onFocus(FocusEvent event) { + hasFocus = true; + } + }); + + addBlurHandler(new BlurHandler() { + @Override + public void onBlur(BlurEvent event) { + hasFocus = false; + } + }); + } + + /** + * Overridden to return "" from an empty text box. + * + * @see com.google.gwt.user.client.ui.TextBoxBase#getValue() + */ + @Override + public String getValue() { + String raw = super.getValue(); + return raw == null ? "" : raw; //$NON-NLS-1$ } @Override public void setText(String text) { - String renderedText = new EmptyValueRenderer<String>( - handleEmptyValue ? unAvailablePropertyLabel : "").render(text); //$NON-NLS-1$ - renderedText = unEscapeRenderedText(renderedText); + super.setText(text); final int cursorPosition = getCursorPos(); final int selectionLength = getSelectionLength(); - super.setText(renderedText); + String renderedText = text; if (getTooltipCaption() != null) { renderedText = getTooltipCaption() + ": " + renderedText; //$NON-NLS-1$ } setTitle(renderedText); if (hasFocus) { - - // needs to be deferred, because the setSelection works + // Needs to be deferred, because the setSelection works // only after the element has been attached to the document // which is not yet true Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override public void execute() { setFocus(true); @@ -98,11 +97,6 @@ } }); } - } - - private String unEscapeRenderedText(String renderedText) { - renderedText = renderedText.replace("<", "<"); //$NON-NLS-1$ //$NON-NLS-2$ - return renderedText; } public String getTooltipCaption() { diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java new file mode 100644 index 0000000..3cb9fff --- /dev/null +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/label/TextBoxLabelBase.java @@ -0,0 +1,48 @@ +package org.ovirt.engine.ui.common.widget.label; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.MouseDownEvent; +import com.google.gwt.event.dom.client.MouseDownHandler; +import com.google.gwt.text.shared.Parser; +import com.google.gwt.text.shared.Renderer; +import com.google.gwt.user.client.ui.ValueBoxBase; + +/** + * Read-only text box widget used to render label values with added functionality. + * <p> + * This widget renders a border-less {@code <input type="text" readonly>} element. Right-clicking the input element + * causes the element to gain focus and select all text, so that the user can simply choose "Copy" within the context + * menu. + * + * @param <T> + * Value type. + */ +public abstract class TextBoxLabelBase<T> extends ValueBoxBase<T> { + + public TextBoxLabelBase(Renderer<T> renderer, Parser<T> parser) { + super(Document.get().createTextInputElement(), renderer, parser); + setReadOnly(true); + initStyles(); + addHandlers(); + } + + protected void initStyles() { + getElement().getStyle().setBorderWidth(0, Unit.PX); + getElement().getStyle().setWidth(100, Unit.PCT); + } + + protected void addHandlers() { + addDomHandler(new MouseDownHandler() { + @Override + public void onMouseDown(MouseDownEvent event) { + if (event.getNativeButton() == NativeEvent.BUTTON_RIGHT) { + setFocus(true); + selectAll(); + } + } + }, MouseDownEvent.getType()); + } + +} -- To view, visit http://gerrit.ovirt.org/21289 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I728f7d6fdc74523ac397225c1c5833cb84f6eef9 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Vojtech Szocs <vsz...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches