Gilad Chaplik has uploaded a new change for review.

Change subject: webadmin: cluster policy look & feel enhancements
......................................................................

webadmin: cluster policy look & feel enhancements

Adding dnd functionality to clsuter policy dialog.

Signed-off-by: Gilad Chaplik <[email protected]>
Change-Id: Ie321547211217e837c8fe7b57866ef741d4a29e0
---
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/NewClusterPolicyModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/FunctionPolicyUnitPanel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitListPanel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitStyle.java
8 files changed, 319 insertions(+), 80 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/71/17371/1

diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/NewClusterPolicyModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/NewClusterPolicyModel.java
index db3b71a..d17bc4e 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/NewClusterPolicyModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/scheduling/NewClusterPolicyModel.java
@@ -539,8 +539,8 @@
         getName().validateEntity(new IValidation[] { new NotEmptyValidation(), 
new LengthValidation(50),
                 new AsciiNameValidation() });
         getDescription().validateEntity(new IValidation[] { new 
LengthValidation(400), new AsciiOrNoneValidation() });
-        return getName().getIsValid() && getDescription().getIsValid();
-        //                && getCustomPropertySheet().validate();
+        return getName().getIsValid() && getDescription().getIsValid()
+                && getCustomPropertySheet().validate();
     }
 
     private void reset() {
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
index fcd5d34..fab797b 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
@@ -2,8 +2,6 @@
 
 import org.ovirt.engine.ui.common.CommonApplicationConstants;
 
-import com.google.gwt.i18n.client.Constants.DefaultStringValue;
-
 public interface ApplicationConstants extends CommonApplicationConstants {
 
     @DefaultStringValue("oVirt Engine Web Administration")
@@ -3005,7 +3003,7 @@
     @DefaultStringValue("Filter Modules")
     String clusterPolicyFilterLabel();
 
-    @DefaultStringValue("Function Modules")
+    @DefaultStringValue("Weights Modules")
     String clusterPolicyFunctionLabel();
 
     @DefaultStringValue("Load Balancer")
@@ -3026,13 +3024,13 @@
     @DefaultStringValue("Disabled Filters")
     String disabledFilters();
 
-    @DefaultStringValue("Enabled Functions & Factors")
+    @DefaultStringValue("Enabled Weights & Factors")
     String enabledFunctions();
 
-    @DefaultStringValue("Disabled Functions")
+    @DefaultStringValue("Disabled Weights")
     String disabledFunctions();
 
-    @DefaultStringValue("* Use context menu to move items")
+    @DefaultStringValue("Drag or use context menu to make changes")
     String clusterPolicyExplanationMessage();
 
     @DefaultStringValue("First")
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java
index 12e055f..47ee664 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.java
@@ -23,6 +23,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.FunctionPolicyUnitPanel;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.PolicyUnitListPanel;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.PolicyUnitPanel;
+import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.PolicyUnitStyle;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.editor.client.SimpleBeanEditorDriver;
@@ -77,6 +78,9 @@
     @UiField(provided = true)
     PolicyUnitListPanel unusedFunctionPanel;
 
+    @UiField
+    PolicyUnitStyle style;
+
     @Inject
     public ClusterPolicyPopupView(EventBus eventBus, ApplicationResources 
resources, ApplicationConstants constants) {
         super(eventBus, resources);
@@ -89,10 +93,17 @@
     }
 
     private void initPanels() {
-        usedFilterPanel = new PolicyUnitListPanel();
-        unusedFilterPanel = new PolicyUnitListPanel();
-        usedFunctionPanel = new PolicyUnitListPanel();
-        unusedFunctionPanel = new PolicyUnitListPanel();
+        usedFilterPanel = new PolicyUnitListPanel(PolicyUnitPanel.FILTER, 
true);
+        unusedFilterPanel = new PolicyUnitListPanel(PolicyUnitPanel.FILTER, 
false);
+        usedFunctionPanel = new 
PolicyUnitListPanel(FunctionPolicyUnitPanel.FUNCTION, true);
+        unusedFunctionPanel = new 
PolicyUnitListPanel(FunctionPolicyUnitPanel.FUNCTION, false);
+    }
+
+    private void setPanelModel(NewClusterPolicyModel model) {
+        usedFilterPanel.setModel(model);
+        unusedFilterPanel.setModel(model);
+        usedFunctionPanel.setModel(model);
+        unusedFunctionPanel.setModel(model);
     }
 
     private void initListBoxEditors() {
@@ -111,6 +122,7 @@
 
     public void edit(final NewClusterPolicyModel model) {
         driver.edit(model);
+        setPanelModel(model);
         updateFilters(model);
         model.getFiltersChangedEvent().addListener(new IEventListener() {
 
@@ -151,13 +163,14 @@
                             model,
                             true,
                             model.getClusterPolicy().isLocked(),
+                            style,
                             pair.getSecond());
             usedFunctionPanel.add(functionPolicyUnitPanel);
             functionPolicyUnitPanel.initWidget();
         }
         unusedFunctionPanel.clear();
         for (PolicyUnit policyUnit : model.getUnusedFunctions()) {
-            functionPolicyUnitPanel = new FunctionPolicyUnitPanel(policyUnit, 
model, false, false, null);
+            functionPolicyUnitPanel = new FunctionPolicyUnitPanel(policyUnit, 
model, false, false, style, null);
             unusedFunctionPanel.add(functionPolicyUnitPanel);
             functionPolicyUnitPanel.initWidget();
         }
@@ -170,7 +183,8 @@
         List<PolicyUnitPanel> list = new ArrayList<PolicyUnitPanel>();
         PolicyUnitPanel tempPolicyUnitPanel;
         for (PolicyUnit policyUnit : model.getUsedFilters()) {
-            tempPolicyUnitPanel = new PolicyUnitPanel(policyUnit, model, true, 
model.getClusterPolicy().isLocked());
+            tempPolicyUnitPanel =
+                    new PolicyUnitPanel(policyUnit, model, true, 
model.getClusterPolicy().isLocked(), style);
             Integer position = 
model.getFilterPositionMap().get(policyUnit.getId());
             if (position == null || position == 0) {
                 list.add(tempPolicyUnitPanel);
@@ -196,7 +210,7 @@
         unusedFilterPanel.clear();
         for (PolicyUnit policyUnit : model.getUnusedFilters()) {
             PolicyUnitPanel policyUnitPanel =
-                    new PolicyUnitPanel(policyUnit, model, false, 
model.getClusterPolicy().isLocked());
+                    new PolicyUnitPanel(policyUnit, model, false, 
model.getClusterPolicy().isLocked(), style);
             unusedFilterPanel.add(policyUnitPanel);
             policyUnitPanel.initWidget();
         }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml
index dd8dd28..d159f56 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/ClusterPolicyPopupView.ui.xml
@@ -8,24 +8,69 @@
 
        <ui:with field='constants'
                type='org.ovirt.engine.ui.webadmin.ApplicationConstants' />
-       <ui:style>
+       <ui:style
+               
type="org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels.PolicyUnitStyle">
                .sectionLabel {
                font-weight: bold;
                font-size: 15px;
-               margin-top: 5px;
-               margin-bottom: 5px;
+               margin-top: 2px;
+               margin-bottom: 1px;
                margin-left: 5px;
+               width: 100%;
                }
                .labelStyle {
-               font-weight: bold;
-               margin-left: 5px;
+               font-size: 11px;
+               margin-left: 10px;
+               line-height: 25px;
+               }
+               .panelHeaderLabelStyle {
+               margin-left: 30%;
                }
                .policyListPanel{
                background-color:
                #F6F6F6;
-               width:
-               250px;
+               width: 97%;
                height: 100px;
+               margin: 5px 5px 5px
+               5px;
+               }
+               .separator {
+               background-color: #CED8DF;
+               width: 100%;
+               height: 100%;
+               }
+               .unusedPolicyUnitStyle {
+               height: 20px;
+               width: 94%;
+               background-color:
+               white;
+               border: 1px solid
+               black;
+               margin: 4px;
+               cursor: move;
+               }
+               .unusedPolicyUnitStyle:HOVER {
+               box-shadow: 1px 1px 1px 1px rgba(33, 33, 33, 0.3);
+               cursor: move;
+               }
+               .usedFilterPolicyUnitStyle {
+               height: 20px;
+               width: 250px;
+               background-color: #CED8DF;
+               border: 1px
+               solid
+               black;
+               margin: 4px;
+               cursor: move;
+               }
+               .usedFilterPolicyUnitStyle:HOVER {
+               box-shadow: 1px 1px 1px 1px rgba(33, 33, 33, 0.3);
+               }
+               .positionLabelStyle {
+               height:
+               20px;
+               width: 50px;
+               margin: 4px;
                }
        </ui:style>
 
@@ -37,57 +82,81 @@
                                                <e:EntityModelTextBoxEditor 
ui:field="nameEditor" />
                                                <e:EntityModelTextBoxEditor 
ui:field="descriptionEditor" />
                                        </g:HorizontalPanel>
-                                       <g:HTML>
-                                               <hr style="width:100%;" />
-                                       </g:HTML>
-                                       <g:Label 
addStyleNames="{style.sectionLabel}"
-                                               
text="{constants.clusterPolicyFilterLabel}" />
-                                       <g:HorizontalPanel height="100px" 
width="100%">
-                                               <g:VerticalPanel>
-                                                       <g:Label 
addStyleNames="{style.labelStyle}" text="{constants.enabledFilters}" />
-                                                       <p:PolicyUnitListPanel 
ui:field="usedFilterPanel"
-                                                               
styleName="{style.policyListPanel}" />
-                                               </g:VerticalPanel>
-                                               <g:VerticalPanel>
-                                                       <g:Label 
addStyleNames="{style.labelStyle}" text="{constants.disabledFilters}" />
-                                                       <p:PolicyUnitListPanel 
ui:field="unusedFilterPanel"
-                                                               
styleName="{style.policyListPanel}" />
-                                               </g:VerticalPanel>
+                                       <g:HorizontalPanel>
+                                               <g:Label 
addStyleNames="{style.sectionLabel}"
+                                                       
text="{constants.clusterPolicyFilterLabel}" />
+                                               <g:Label 
addStyleNames="{style.labelStyle}"
+                                                       
text="{constants.clusterPolicyExplanationMessage}" />
                                        </g:HorizontalPanel>
-                                       <g:Label 
addStyleNames="{style.labelStyle}"
-                                               
text="{constants.clusterPolicyExplanationMessage}" />
                                        <g:HTML>
                                                <hr style="width:100%;" />
                                        </g:HTML>
-                                       <g:Label 
addStyleNames="{style.sectionLabel}"
-                                               
text="{constants.clusterPolicyFunctionLabel}" />
                                        <g:HorizontalPanel height="100px" 
width="100%">
-                                               <g:VerticalPanel>
-                                                       <g:Label 
addStyleNames="{style.labelStyle}" text="{constants.enabledFunctions}" />
-                                                       <p:PolicyUnitListPanel 
ui:field="usedFunctionPanel"
-                                                               
styleName="{style.policyListPanel}" />
-                                               </g:VerticalPanel>
-                                               <g:VerticalPanel>
-                                                       <g:Label 
addStyleNames="{style.labelStyle}" text="{constants.disabledFunctions}" />
-                                                       <p:PolicyUnitListPanel 
ui:field="unusedFunctionPanel"
-                                                               
styleName="{style.policyListPanel}" />
-                                               </g:VerticalPanel>
+                                               <g:Cell width="50%" 
height="100%">
+                                                       <g:VerticalPanel 
width="100%" height="100%">
+                                                               <g:Label 
addStyleNames="{style.panelHeaderLabelStyle}"
+                                                                       
text="{constants.enabledFilters}" />
+                                                               
<p:PolicyUnitListPanel ui:field="usedFilterPanel"
+                                                                       
styleName="{style.policyListPanel}" />
+                                                       </g:VerticalPanel>
+                                               </g:Cell>
+                                               <g:Cell width="1%" 
height="100%">
+                                                       <g:HTMLPanel 
styleName="{style.separator}">
+                                                       </g:HTMLPanel>
+                                               </g:Cell>
+                                               <g:Cell width="50%" 
height="100%">
+                                                       <g:VerticalPanel 
width="100%" height="100%">
+                                                               <g:Label 
addStyleNames="{style.panelHeaderLabelStyle}"
+                                                                       
text="{constants.disabledFilters}" />
+                                                               
<p:PolicyUnitListPanel ui:field="unusedFilterPanel"
+                                                                       
styleName="{style.policyListPanel}" />
+                                                       </g:VerticalPanel>
+                                               </g:Cell>
                                        </g:HorizontalPanel>
-                                       <g:Label 
addStyleNames="{style.labelStyle}"
-                                               
text="{constants.clusterPolicyExplanationMessage}" />
+                                       <g:HorizontalPanel>
+                                               <g:Label 
addStyleNames="{style.sectionLabel}"
+                                                       
text="{constants.clusterPolicyFunctionLabel}" />
+                                               <g:Label 
addStyleNames="{style.labelStyle}"
+                                                       
text="{constants.clusterPolicyExplanationMessage}" />
+                                       </g:HorizontalPanel>
                                        <g:HTML>
                                                <hr style="width:100%;" />
                                        </g:HTML>
+                                       <g:HorizontalPanel height="100px" 
width="100%">
+                                               <g:Cell width="50%" 
height="100%">
+                                                       <g:VerticalPanel 
width="100%" height="100%">
+                                                               <g:Label 
addStyleNames="{style.panelHeaderLabelStyle}"
+                                                                       
text="{constants.enabledFunctions}" />
+                                                               
<p:PolicyUnitListPanel ui:field="usedFunctionPanel"
+                                                                       
styleName="{style.policyListPanel}" />
+                                                       </g:VerticalPanel>
+                                               </g:Cell>
+                                               <g:Cell width="1%" 
height="100%">
+                                                       <g:HTMLPanel 
styleName="{style.separator}">
+                                                       </g:HTMLPanel>
+                                               </g:Cell>
+                                               <g:Cell width="50%" 
height="100%">
+                                                       <g:VerticalPanel 
width="100%" height="100%">
+                                                               <g:Label 
addStyleNames="{style.panelHeaderLabelStyle}"
+                                                                       
text="{constants.disabledFunctions}" />
+                                                               
<p:PolicyUnitListPanel ui:field="unusedFunctionPanel"
+                                                                       
styleName="{style.policyListPanel}" />
+                                                       </g:VerticalPanel>
+                                               </g:Cell>
+                                       </g:HorizontalPanel>
                                        <g:Label 
addStyleNames="{style.sectionLabel}"
                                                
text="{constants.clusterPolicyLoadBalancerLabel}" />
+                                       <g:HTML>
+                                               <hr style="width:100%;" />
+                                       </g:HTML>
                                        <e:ListModelListBoxOnlyEditor
                                                
ui:field="loadBalanceListEditor" />
                                </g:FlowPanel>
+                               <g:Label addStyleNames="{style.sectionLabel}"
+                                       
text="{constants.clusterPolicyPropertiesLabel}" />
                                <g:HTML>
                                        <hr style="width:100%;" />
                                </g:HTML>
-                               <g:Label addStyleNames="{style.sectionLabel}"
-                                       
text="{constants.clusterPolicyPropertiesLabel}" />
                                <g:ScrollPanel height="100px">
                                        <k:KeyValueWidget 
ui:field="customPropertiesSheetEditor" />
                                </g:ScrollPanel>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/FunctionPolicyUnitPanel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/FunctionPolicyUnitPanel.java
index 50215d1..73abba7 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/FunctionPolicyUnitPanel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/FunctionPolicyUnitPanel.java
@@ -13,9 +13,12 @@
 import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Panel;
 import com.google.gwt.user.client.ui.PushButton;
+import com.google.gwt.user.client.ui.SimplePanel;
 
 public class FunctionPolicyUnitPanel extends PolicyUnitPanel {
+    public static final String FUNCTION = "Function"; //$NON-NLS-1$
     private Integer factor;
     private static final ApplicationResources resources = 
GWT.create(ApplicationResources.class);
 
@@ -23,21 +26,24 @@
             NewClusterPolicyModel model,
             boolean used,
             boolean locked,
+            PolicyUnitStyle style,
             Integer factor) {
-        super(policyUnit, model, used, locked);
+        super(policyUnit, model, used, locked, style);
         this.factor = factor;
     }
 
     @Override
     public void initWidget() {
         HorizontalPanel panel = new HorizontalPanel();
-        Label nameLabel = new Label(policyUnit.getName());
-        nameLabel.setWidth("180px"); //$NON-NLS-1$
-        panel.add(nameLabel);
-        if (used) {
+        Label policyUnitLabel = new Label(policyUnit.getName());
+        if (!used) {
+            panel.setStyleName(style.unusedPolicyUnitStyle());
+            panel.add(policyUnitLabel);
+        } else {
             HorizontalPanel weightPanel = new HorizontalPanel();
             final Label weightLabel = new Label(String.valueOf(factor));
             final PushButton downButton = new PushButton(new 
Image(resources.decreaseIcon()));
+            downButton.setWidth("12px"); //$NON-NLS-1$
             downButton.addClickHandler(new ClickHandler() {
 
                 @Override
@@ -67,6 +73,7 @@
                             }
                         }
                     });
+            upButton.setWidth("12px"); //$NON-NLS-1$
             upButton.getElement().getStyle().setPadding(0, Unit.PX);
             if (!locked) {
                 weightPanel.add(upButton);
@@ -75,8 +82,12 @@
             if (!locked) {
                 weightPanel.add(downButton);
             }
-            weightPanel.setWidth("50px"); //$NON-NLS-1$
+            weightPanel.setStyleName(style.positionLabelStyle());
             panel.add(weightPanel);
+            Panel policyUnitLablePanel = new SimplePanel();
+            policyUnitLablePanel.add(policyUnitLabel);
+            
policyUnitLablePanel.setStyleName(style.usedFilterPolicyUnitStyle());
+            panel.add(policyUnitLablePanel);
         }
         setWidget(panel);
     }
@@ -108,4 +119,9 @@
     protected void addSubMenu(MenuBar menuBar) {
         // No sub menu
     }
+
+    @Override
+    protected String getType() {
+        return FUNCTION;
+    }
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitListPanel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitListPanel.java
index 3886576..770d40a 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitListPanel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitListPanel.java
@@ -1,11 +1,91 @@
 package org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels;
 
-import com.google.gwt.user.client.ui.VerticalPanel;
+import org.ovirt.engine.core.common.scheduling.PolicyUnit;
+import org.ovirt.engine.core.compat.Guid;
+import 
org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.NewClusterPolicyModel;
 
-public class PolicyUnitListPanel extends VerticalPanel {
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.Style.Overflow;
+import com.google.gwt.event.dom.client.DragDropEventBase;
+import com.google.gwt.event.dom.client.DragLeaveEvent;
+import com.google.gwt.event.dom.client.DragLeaveHandler;
+import com.google.gwt.event.dom.client.DragOverEvent;
+import com.google.gwt.event.dom.client.DragOverHandler;
+import com.google.gwt.event.dom.client.DropEvent;
+import com.google.gwt.event.dom.client.DropHandler;
+import com.google.gwt.user.client.ui.FlowPanel;
 
-    private final VerticalPanel verticalPanel = new VerticalPanel();
+public class PolicyUnitListPanel extends FlowPanel {
+    protected NewClusterPolicyModel model;
+    protected String type;
+    protected boolean used;
 
-    public PolicyUnitListPanel() {
+    public PolicyUnitListPanel(String type, boolean used) {
+        this.used = used;
+        this.type = type;
+        getElement().getStyle().setOverflow(Overflow.AUTO);
+        getElement().setDraggable(Element.DRAGGABLE_FALSE);
+        registerToDragEvents();
+    }
+
+    private boolean doDrag(DragDropEventBase<?> event, boolean isDrop) {
+        String dragDropEventData = PolicyUnitPanel.getDragDropEventData(event, 
isDrop);
+        String[] split = dragDropEventData.split(" "); //$NON-NLS-1$
+        if (split != null && split.length == 3) {
+            if (!type.equals(split[0])) {
+                return false;
+            } else if (Boolean.valueOf(split[2]).equals(used)) {
+                return false;
+            }
+        }
+        PolicyUnit policyUnit = 
model.getPolicyUnitsMap().get(Guid.createGuidFromString(split[1]));
+        if (PolicyUnitPanel.FILTER.equals(split[0])) {
+            if (used) {
+                model.addFilter(policyUnit, false, 0);
+            } else {
+                model.removeFilter(policyUnit);
+            }
+        } else if (FunctionPolicyUnitPanel.FUNCTION.equals(split[0])) {
+            if (used) {
+                model.addFunction(policyUnit);
+            } else {
+                model.removeFunction(policyUnit);
+            }
+        }
+        return true;
+    }
+
+    private void registerToDragEvents() {
+        // drag over
+        addBitlessDomHandler(new DragOverHandler() {
+
+            @Override
+            public void onDragOver(DragOverEvent event) {
+                // without registering to these events dnd doesn't get
+            }
+        }, DragOverEvent.getType());
+        // drag leave
+        addBitlessDomHandler(new DragLeaveHandler() {
+
+            @Override
+            public void onDragLeave(DragLeaveEvent event) {
+                event.preventDefault();
+                doDrag(event, true);
+            }
+        }, DragLeaveEvent.getType());
+        addBitlessDomHandler(new DropHandler() {
+
+            @Override
+            public void onDrop(DropEvent event) {
+            }
+        }, DropEvent.getType());
+    }
+
+    public NewClusterPolicyModel getModel() {
+        return model;
+    }
+
+    public void setModel(NewClusterPolicyModel model) {
+        this.model = model;
     }
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java
index 78cde05..c80bedb 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitPanel.java
@@ -7,15 +7,22 @@
 import org.ovirt.engine.ui.webadmin.ApplicationConstants;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.ContextMenuEvent;
 import com.google.gwt.event.dom.client.ContextMenuHandler;
+import com.google.gwt.event.dom.client.DragDropEventBase;
+import com.google.gwt.event.dom.client.DragStartEvent;
+import com.google.gwt.event.dom.client.DragStartHandler;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.FocusPanel;
 import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Panel;
+import com.google.gwt.user.client.ui.SimplePanel;
 
 public class PolicyUnitPanel extends FocusPanel {
+    public static final String FILTER = "Filter"; //$NON-NLS-1$
     private static final ApplicationConstants constants = 
GWT.create(ApplicationConstants.class);
     static final PopupPanel menuPopup = new PopupPanel(true);
     protected final PolicyUnit policyUnit;
@@ -23,15 +30,20 @@
     protected boolean locked;
     protected final NewClusterPolicyModel model;
     protected int position;
+    PolicyUnitStyle style;
+
+    protected static String lastDragData = ""; //$NON-NLS-1$
 
     public PolicyUnitPanel(PolicyUnit policyUnit,
             NewClusterPolicyModel model,
-            boolean used,
-            boolean locked) {
+            final boolean used,
+            boolean locked,
+            PolicyUnitStyle style) {
         this.policyUnit = policyUnit;
         this.model = model;
         this.used = used;
         this.locked = locked;
+        this.style = style;
         if (!locked) {
             addDomHandler(new ContextMenuHandler() {
 
@@ -45,24 +57,49 @@
                 }
 
             }, ContextMenuEvent.getType());
+            // enable d&d
+            getElement().setDraggable(Element.DRAGGABLE_TRUE);
+            // drag start
+            addBitlessDomHandler(new DragStartHandler() {
+                @Override
+                public void onDragStart(DragStartEvent event) {
+                    PolicyUnitPanel sourcePanel = (PolicyUnitPanel) 
event.getSource();
+                    lastDragData = getType() + " " + 
sourcePanel.policyUnit.getId() + " " + Boolean.toString(used); //$NON-NLS-1$ 
//$NON-NLS-2$
+                    event.setData("Text", lastDragData); //$NON-NLS-1$
+                    // show a ghost of the widget under cursor.
+                    NativeEvent nativeEvent = event.getNativeEvent();
+                    int x = nativeEvent.getClientX() - 
sourcePanel.getAbsoluteLeft();
+                    int y = nativeEvent.getClientY() - 
sourcePanel.getAbsoluteTop();
+                    
event.getDataTransfer().setDragImage(sourcePanel.getElement(), x, y);
+                }
+            }, DragStartEvent.getType());
         }
     }
 
     public void initWidget() {
         HorizontalPanel panel = new HorizontalPanel();
-        Label nameLabel = new Label(policyUnit.getName());
-        nameLabel.setWidth("180px");//$NON-NLS-1$
-        panel.add(nameLabel);
-        if (used && position != 0) {
-            String labelText = null;
-            if (position == -1) {
-                labelText = constants.firstFilter();
-            } else if (position == 1) {
-                labelText = constants.lastFilter();
-            }
-            Label label = new Label(labelText);
-            label.setWidth("50px");//$NON-NLS-1$
+        Label policyUnitLabel = new Label(policyUnit.getName());
+        if (!used) {
+            panel.setStyleName(style.unusedPolicyUnitStyle());
+            panel.add(policyUnitLabel);
+        } else {
+            Panel policyUnitLablePanel = new SimplePanel();
+            policyUnitLablePanel.add(policyUnitLabel);
+            
policyUnitLablePanel.setStyleName(style.usedFilterPolicyUnitStyle());
+            Label label = new Label();
+            label.setStyleName(style.positionLabelStyle());
             panel.add(label);
+            if (position != 0) {
+                String labelText = null;
+                if (position == -1) {
+                    labelText = constants.firstFilter();
+                } else if (position == 1) {
+                    labelText = constants.lastFilter();
+                }
+                label.setText(labelText);
+            }
+            panel.setWidth("100%"); //$NON-NLS-1$
+            panel.add(policyUnitLablePanel);
         }
         setWidget(panel);
     }
@@ -138,4 +175,18 @@
         this.position = position;
     }
 
+    protected String getType() {
+        return FILTER;
+    }
+
+    public static String getDragDropEventData(DragDropEventBase<?> event, 
boolean isDrop) {
+        if (isDrop) {
+            return event.getData("Text"); //$NON-NLS-1$
+        } else
+        {
+            // On most of the browsers drag, dragenter, dragleave, dragover 
and dragend don't have access to event's
+            // data
+            return lastDragData;
+        }
+    }
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitStyle.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitStyle.java
new file mode 100644
index 0000000..fce17ae
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/scheduling/panels/PolicyUnitStyle.java
@@ -0,0 +1,11 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels;
+
+import com.google.gwt.resources.client.CssResource;
+
+public interface PolicyUnitStyle extends CssResource {
+    String unusedPolicyUnitStyle();
+
+    String usedFilterPolicyUnitStyle();
+
+    String positionLabelStyle();
+}


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie321547211217e837c8fe7b57866ef741d4a29e0
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Gilad Chaplik <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to