Tomas Jelinek has uploaded a new change for review.

Change subject: frontend: widgets needed to support instance types
......................................................................

frontend: widgets needed to support instance types

The instance types need widgets, which decorates existing widgets and add a
"attached" and "detached" icons next to them (with an ability to change this).

This patch introduces this widgets.

feature page: http://www.ovirt.org/Features/Instance_Types
Change-Id: I1fcc24e753fad19273ba3b16fba0b8be70bc4395
Signed-off-by: Tomas Jelinek <[email protected]>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidgetWithLabel.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelDetachableWidgetWithInfo.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.ui.xml
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasDetachable.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.ui.xml
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.ui.xml
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.ui.xml
A 
frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/joined.png
A 
frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/separated.png
15 files changed, 509 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/23/25023/10

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java
index b11d77f..4793dcb 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationResources.java
@@ -277,4 +277,10 @@
 
     @Source("images/separator.gif")
     ImageResource separator();
+
+    @Source("images/joined.png")
+    ImageResource joinedIcon();
+
+    @Source("images/separated.png")
+    ImageResource separatedIcon();
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidgetWithLabel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidgetWithLabel.java
index 7a97c5a..17adf1a 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidgetWithLabel.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidgetWithLabel.java
@@ -1,9 +1,5 @@
 package org.ovirt.engine.ui.common.widget;
 
-import org.ovirt.engine.ui.common.idhandler.HasElementId;
-import org.ovirt.engine.ui.common.view.popup.FocusableComponentsContainer;
-import org.ovirt.engine.ui.common.widget.editor.EditorWidget;
-
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.LabelElement;
@@ -20,6 +16,9 @@
 import com.google.gwt.user.client.ui.HTMLPanel;
 import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.Widget;
+import org.ovirt.engine.ui.common.idhandler.HasElementId;
+import org.ovirt.engine.ui.common.view.popup.FocusableComponentsContainer;
+import org.ovirt.engine.ui.common.widget.editor.EditorWidget;
 
 /**
  * Base class for validated widgets that have a label associated with them.
@@ -68,7 +67,9 @@
     public AbstractValidatedWidgetWithLabel(W contentWidget, 
VisibilityRenderer renderer) {
         this.contentWidget = contentWidget;
         this.renderer = renderer;
+
         initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
+
     }
 
     public AbstractValidatedWidgetWithLabel(W contentWidget) {
@@ -90,7 +91,7 @@
         }
 
         // Connect label with content widget for better accessibility
-        updateLabelElementId(contentWidgetElement.getId());
+        updateLabelElementId(getContentWidgetElement().getId());
     }
 
     protected void updateLabelElementId(String elementId) {
@@ -196,9 +197,9 @@
         contentWidget.setEnabled(enabled);
 
         if (enabled) {
-            labelElement.replaceClassName(style.labelDisabled(), 
style.labelEnabled());
+            getLabelElement().replaceClassName(style.labelDisabled(), 
style.labelEnabled());
         } else {
-            labelElement.replaceClassName(style.labelEnabled(), 
style.labelDisabled());
+            getLabelElement().replaceClassName(style.labelEnabled(), 
style.labelDisabled());
         }
 
         if (!keepTitleOnSetEnabled) {
@@ -225,11 +226,11 @@
     }
 
     public void setLabelStyleName(String styleName) {
-        labelElement.setClassName(styleName);
+        getLabelElement().setClassName(styleName);
     }
 
     public void addLabelStyleName(String styleName) {
-        labelElement.addClassName(styleName);
+        getLabelElement().addClassName(styleName);
     }
 
     public void addWrapperStyleName(String styleName) {
@@ -237,7 +238,7 @@
     }
 
     public void hideLabel() {
-        labelElement.addClassName(style.labelHidden());
+        getLabelElement().addClassName(style.labelHidden());
     }
 
     public void setKeepTitleOnSetEnabled(boolean keepTitleOnSetEnabled) {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelDetachableWidgetWithInfo.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelDetachableWidgetWithInfo.java
new file mode 100644
index 0000000..e8c2fd7
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelDetachableWidgetWithInfo.java
@@ -0,0 +1,38 @@
+package org.ovirt.engine.ui.common.widget;
+
+import com.google.gwt.user.client.ui.HasEnabled;
+import org.ovirt.engine.ui.common.widget.editor.EntityModelLabel;
+import 
org.ovirt.engine.ui.common.widget.editor.generic.EntityModelDetachableWidget;
+
+public class EntityModelDetachableWidgetWithInfo extends 
EntityModelWidgetWithInfo implements HasDetachable, HasEnabled {
+
+    public EntityModelDetachableWidgetWithInfo(EntityModelLabel label, 
AbstractValidatedWidgetWithLabel contentWidget) {
+        super(label, new EntityModelDetachableWidget(contentWidget));
+    }
+
+    @Override
+    public void setDetachableIconVisible(boolean visible) {
+        ((HasDetachable) contentWidget).setDetachableIconVisible(visible);
+    }
+
+    @Override
+    public void setAttached(boolean attached) {
+        ((HasDetachable) contentWidget).setAttached(attached);
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        ((HasEnabled) contentWidget).setEnabled(enabled);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return ((HasEnabled) contentWidget).isEnabled();
+    }
+
+    public EntityModelDetachableWidget getContentWidget() {
+        // it is safe since I it is created in this class and there is no way 
to create it from outside
+        return (EntityModelDetachableWidget) contentWidget;
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
index cdd5b93..bff9dbe 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
@@ -28,10 +28,10 @@
     InfoIcon infoIcon;
 
     @UiField(provided = true)
-    AbstractValidatedWidget contentWidget;
+    Composite contentWidget;
 
     @Inject
-    public EntityModelWidgetWithInfo(EntityModelLabel label, 
AbstractValidatedWidget contentWidget) {
+    public EntityModelWidgetWithInfo(EntityModelLabel label, Composite 
contentWidget) {
 
         this.label = label;
         this.contentWidget = contentWidget;
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.ui.xml
index 7bb4ab1..6279106 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.ui.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.ui.xml
@@ -18,7 +18,7 @@
                        </g:HorizontalPanel>
                </g:cell>
                <g:cell width="230px">
-                       <w:AbstractValidatedWidget ui:field="contentWidget" />
+                       <g:Composite ui:field="contentWidget" />
                </g:cell>
        </g:HorizontalPanel>
 
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasDetachable.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasDetachable.java
new file mode 100644
index 0000000..1b376df
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasDetachable.java
@@ -0,0 +1,19 @@
+package org.ovirt.engine.ui.common.widget;
+
+/**
+ * Widgets that implement this interface have a visual representation which 
shows this widget attached or detached to something
+ */
+public interface HasDetachable {
+
+    /**
+     * This widget shows some icon which means if this widget is attached to 
something or not.
+     * This method hides/shows this icon
+     */
+    void setDetachableIconVisible(boolean visible);
+
+    /**
+     * Changes the icon to attached/detached
+     */
+    void setAttached(boolean attached);
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
new file mode 100644
index 0000000..16c59859
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
@@ -0,0 +1,67 @@
+package org.ovirt.engine.ui.common.widget.editor.generic;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Style.Display;
+import com.google.gwt.resources.client.CssResource;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.UIObject;
+import org.ovirt.engine.ui.common.CommonApplicationResources;
+import org.ovirt.engine.ui.common.widget.HasDetachable;
+
+public abstract class BaseEntityModelDetachableWidget extends Composite 
implements HasDetachable {
+
+    private static final CommonApplicationResources resource = 
GWT.create(CommonApplicationResources.class);
+
+    private Image attachedSeparatedImage;
+
+    interface BaseStyle extends CssResource {
+        String contentWidgetWithDetachable();
+
+        String contentWidgetWithoutDetachable();
+    }
+
+    private BaseStyle style;
+
+    private UIObject decoratedWidget;
+
+    // can not be as a constructor because needs to be called after the 
widgets get bind properly in children
+    protected void initialize(UIObject decoratedWidget, Image 
attachedSeparatedImage, BaseStyle style) {
+        this.decoratedWidget = decoratedWidget;
+        this.attachedSeparatedImage = attachedSeparatedImage;
+        this.style = style;
+
+        setAttached(true);
+
+        // by default it is a regular widget - needs to be made detachable 
explicitly
+        setDetachableIconVisible(false);
+    }
+
+    @Override
+    public void setDetachableIconVisible(boolean visible) {
+        if (visible) {
+            
attachedSeparatedImage.getElement().getStyle().setDisplay(Display.INLINE);
+        } else {
+            
attachedSeparatedImage.getElement().getStyle().setDisplay(Display.NONE);
+        }
+
+        changeWidgetStyle(decoratedWidget, visible);
+    }
+
+    protected void changeWidgetStyle(UIObject widget, boolean 
detachableIconVisible) {
+        if (detachableIconVisible) {
+            widget.removeStyleName(style.contentWidgetWithoutDetachable());
+            widget.addStyleName(style.contentWidgetWithDetachable());
+        } else {
+            widget.removeStyleName(style.contentWidgetWithDetachable());
+            widget.addStyleName(style.contentWidgetWithoutDetachable());
+        }
+    }
+
+    @Override
+    public void setAttached(boolean attached) {
+        attachedSeparatedImage.setResource(attached ? resource.joinedIcon() : 
resource.separatedIcon());
+    }
+
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.java
new file mode 100644
index 0000000..b620c47
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.java
@@ -0,0 +1,45 @@
+package org.ovirt.engine.ui.common.widget.editor.generic;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiChild;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Takes a AbstractValidatedWidgetWithLabel, decorates it with the detachable 
icon but does not render it's label
+ */
+public class DetachableLabel extends BaseEntityModelDetachableWidget {
+
+    interface WidgetUiBinder extends UiBinder<Widget, DetachableLabel> {
+        WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
+    }
+
+    interface Style extends BaseStyle {
+    }
+
+    @UiField
+    Image attachedSeparatedImage;
+
+    @UiField(provided = true)
+    Label decorated;
+
+    @UiField
+    Style style;
+
+    @UiChild(tagname = "decorated", limit = 1)
+    public void setHeader(Label decorated) {
+        this.decorated = decorated;
+
+        initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
+
+        initialize(decorated, attachedSeparatedImage, style);
+    }
+
+    public void setContentWidgetStyleName(String contentWidgetStyleName) {
+        decorated.setStyleName(contentWidgetStyleName);
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.ui.xml
new file mode 100644
index 0000000..9241a6c
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/DetachableLabel.ui.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui">
+
+    <ui:with field='resources' 
type='org.ovirt.engine.ui.common.CommonApplicationResources'/>
+
+    <ui:style 
type="org.ovirt.engine.ui.common.widget.editor.generic.DetachableLabel.Style">
+        .image {
+            margin-top: 11px;
+            margin-left: 5px;
+        }
+
+        .wrapper {
+            text-align: left;
+        }
+
+        .contentWrapper {
+            float: left;
+            width: 100%;
+        }
+
+        .contentWidgetWithoutDetachable, .contentWidgetWithDetachable {
+            float: left;
+        }
+
+    </ui:style>
+
+    <g:FlowPanel addStyleNames="{style.contentWrapper}">
+        <g:Label ui:field="decorated"/>
+        <g:FlowPanel addStyleNames="{style.image}">
+            <g:Image ui:field="attachedSeparatedImage" />
+        </g:FlowPanel>
+    </g:FlowPanel>
+
+</ui:UiBinder>
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
new file mode 100644
index 0000000..94f74ce
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
@@ -0,0 +1,79 @@
+package org.ovirt.engine.ui.common.widget.editor.generic;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Style;
+import com.google.gwt.dom.client.Style.Float;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.HasEnabled;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
+import org.ovirt.engine.ui.common.widget.AbstractValidatedWidgetWithLabel;
+import org.ovirt.engine.ui.common.widget.Align;
+
+/**
+ * Takes a AbstractValidatedWidgetWithLabel, decorates it with the detachable 
icon but does not render it's label
+ */
+public class EntityModelDetachableWidget extends 
BaseEntityModelDetachableWidget implements HasEnabled {
+
+    interface WidgetUiBinder extends UiBinder<Widget, 
EntityModelDetachableWidget> {
+        WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
+    }
+
+    interface Style extends BaseStyle {
+        String contentWrapperImageOnRight();
+        String contentWrapper();
+    }
+
+    @UiField
+    Image attachedSeparatedImage;
+
+    @UiField(provided = true)
+    SimplePanel contentWidgetContainer;
+
+    private AbstractValidatedWidgetWithLabel decorated;
+
+    @UiField
+    FlowPanel contentWrapper;
+
+    @UiField
+    Style style;
+
+    public EntityModelDetachableWidget(AbstractValidatedWidgetWithLabel 
decorated, Align attachedImageAlign) {
+        this.decorated = decorated;
+        this.contentWidgetContainer = decorated.getContentWidgetContainer();
+
+        initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
+
+        if (attachedImageAlign == Align.LEFT) {
+            
contentWidgetContainer.getElement().getStyle().setFloat(Float.RIGHT);
+        } else {
+            
contentWidgetContainer.getElement().getStyle().setFloat(Float.LEFT);
+            contentWidgetContainer.getElement().getStyle().setWidth(230, 
com.google.gwt.dom.client.Style.Unit.PX);
+            contentWrapper.removeStyleName(style.contentWrapper());
+            contentWrapper.addStyleName(style.contentWrapperImageOnRight());
+        }
+
+        initialize(contentWidgetContainer, attachedSeparatedImage, style);
+    }
+
+    public EntityModelDetachableWidget(AbstractValidatedWidgetWithLabel 
decorated) {
+        this(decorated, Align.LEFT);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return decorated.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        decorated.setEnabled(enabled);
+    }
+
+    public void addContentWrapperStypeName(String styleName) {
+        contentWrapper.addStyleName(styleName);
+    }
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.ui.xml
new file mode 100644
index 0000000..f8dec5d
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.ui.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui"
+             xmlns:w="urn:import:org.ovirt.engine.ui.common.widget">
+
+    <ui:with field='resources' 
type='org.ovirt.engine.ui.common.CommonApplicationResources' />
+
+    <ui:style 
type="org.ovirt.engine.ui.common.widget.editor.generic.EntityModelDetachableWidget.Style">
+        .image {
+            margin-top: 7px;
+            float: left;
+        }
+
+        .wrapper {
+            text-align: left;
+            clear: both;
+        }
+
+        .contentWrapper {
+            float: right;
+            width: 230px;
+            padding: 0 5px;
+        }
+
+        .contentWrapperImageOnRight {
+            padding: 0 5px;
+        }
+
+        .contentWidgetWithoutDetachable, .contentWidgetWithDetachable {
+            float: right;
+        }
+        .contentWidgetWithoutDetachable {
+            padding: 0 5px;
+            width: 230px;
+        }
+
+        .contentWidgetWithDetachable {
+            padding: 0 0px;
+            width: 200px;
+        }
+
+        .contentWidgetContainer {
+            /*width: 230px;*/
+        }
+
+    </ui:style>
+
+    <g:HTMLPanel ui:field="wrapperPanel" addStyleNames="{style.wrapper}">
+        <g:FlowPanel ui:field="contentWrapper" 
addStyleNames="{style.contentWrapper}">
+            <g:FlowPanel addStyleNames="{style.image}">
+                <g:Image ui:field="attachedSeparatedImage" />
+            </g:FlowPanel>
+
+            <g:SimplePanel ui:field="contentWidgetContainer" 
addStyleNames="{style.contentWidgetContainer}" />
+        </g:FlowPanel>
+    </g:HTMLPanel>
+
+</ui:UiBinder>
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
new file mode 100644
index 0000000..f7538ef
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
@@ -0,0 +1,83 @@
+package org.ovirt.engine.ui.common.widget.editor.generic;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.LabelElement;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.HasEnabled;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
+import org.ovirt.engine.ui.common.widget.AbstractValidatedWidgetWithLabel;
+import org.ovirt.engine.ui.common.widget.HasLabel;
+
+public class EntityModelDetachableWidgetWithLabel extends 
BaseEntityModelDetachableWidget implements HasLabel, HasEnabled {
+
+    interface WidgetUiBinder extends UiBinder<Widget, 
EntityModelDetachableWidgetWithLabel> {
+        WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
+    }
+
+    interface Style extends BaseStyle {
+
+        String labelEnabled();
+
+        String labelDisabled();
+    }
+
+    @UiField
+    LabelElement label;
+
+    @UiField(provided = true)
+    SimplePanel contentWidgetContainer;
+
+    @UiField
+    Image attachedSeparatedImage;
+
+    @UiField
+    FlowPanel contentWrapper;
+
+    @UiField
+    Style style;
+
+    private AbstractValidatedWidgetWithLabel decorated;
+
+    public 
EntityModelDetachableWidgetWithLabel(AbstractValidatedWidgetWithLabel 
decorated) {
+        this.decorated = decorated;
+        contentWidgetContainer = decorated.getContentWidgetContainer();
+
+        initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
+
+        initialize(contentWidgetContainer, attachedSeparatedImage, style);
+    }
+
+    @Override
+    public String getLabel() {
+        return label.getInnerText();
+    }
+
+    @Override
+    public void setLabel(String label) {
+        this.label.setInnerText(label);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return decorated.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        decorated.setEnabled(enabled);
+
+        if (enabled) {
+            label.replaceClassName(style.labelDisabled(), 
style.labelEnabled());
+        } else {
+            label.replaceClassName(style.labelEnabled(), 
style.labelDisabled());
+        }
+    }
+
+    public void addContentWrapperStypeName(String styleName) {
+        contentWrapper.addStyleName(styleName);
+    }
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.ui.xml
new file mode 100644
index 0000000..ffab985
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.ui.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui">
+
+    <ui:with field='resources' 
type='org.ovirt.engine.ui.common.CommonApplicationResources' />
+
+    <ui:style 
type="org.ovirt.engine.ui.common.widget.editor.generic.EntityModelDetachableWidgetWithLabel.Style">
+        .image {
+            margin-top: 7px;
+            float: left;
+        }
+
+        .wrapper {
+            text-align: left;
+        }
+
+        .contentWrapper {
+            float: right;
+            width: 230px;
+            padding: 0 5px;
+        }
+
+        .contentWidgetWithoutDetachable, .contentWidgetWithDetachable {
+            float: right;
+        }
+        .contentWidgetWithoutDetachable {
+            padding: 0 5px;
+            width: 230px;
+        }
+
+        .contentWidgetWithDetachable {
+            padding: 0 0px;
+            width: 200px;
+        }
+
+        .label {
+            font-size: 13px;
+            padding: 0 5px;
+            font-family: Verdana,sans-serif;
+            line-height: 30px;
+        }
+
+        .labelEnabled {
+            color: #333333;
+        }
+
+        .labelDisabled {
+            color: gray;
+        }
+    </ui:style>
+
+    <g:HTMLPanel ui:field="wrapperPanel" addStyleNames="{style.wrapper}">
+
+        <label ui:field="label" class="{style.label} {style.labelEnabled}" />
+
+        <g:FlowPanel ui:field="contentWrapper" 
addStyleNames="{style.contentWrapper}">
+            <g:FlowPanel addStyleNames="{style.image}">
+                <g:Image ui:field="attachedSeparatedImage" />
+            </g:FlowPanel>
+
+            <g:SimplePanel ui:field="contentWidgetContainer"  />
+        </g:FlowPanel>
+    </g:HTMLPanel>
+
+</ui:UiBinder>
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/joined.png
 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/joined.png
new file mode 100644
index 0000000..44036e0
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/joined.png
Binary files differ
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/separated.png
 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/separated.png
new file mode 100644
index 0000000..68eaa71
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/ui/common/images/separated.png
Binary files differ


-- 
To view, visit http://gerrit.ovirt.org/25023
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1fcc24e753fad19273ba3b16fba0b8be70bc4395
Gerrit-PatchSet: 10
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Tomas Jelinek <[email protected]>
Gerrit-Reviewer: [email protected]
Gerrit-Reviewer: oVirt Jenkins CI Server
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to