package org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.panels; import org.ovirt.engine.core.common.scheduling.PolicyUnit; import org.ovirt.engine.ui.common.widget.MenuBar; import org.ovirt.engine.ui.common.widget.PopupPanel; import org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.NewClusterPolicyModel; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.section.main.view.popup.scheduling.ClusterPolicyPopupView.WidgetStyle; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ContextMenuEvent; import com.google.gwt.event.dom.client.DragDropEventBase; import com.google.gwt.event.dom.client.DragStartEvent; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; public class PolicyUnitPanel extends FocusPanel { public static final String FILTER = "Filter"; //$NON-NLS-1$ static final PopupPanel menuPopup = new PopupPanel(true); protected final PolicyUnit policyUnit; protected boolean used; protected boolean locked; protected final NewClusterPolicyModel model; protected int position; WidgetStyle style; private static String lastDragData = ""; //$NON-NLS-1$ private static final ApplicationConstants constants = AssetProvider.getConstants(); public PolicyUnitPanel(PolicyUnit policyUnit, NewClusterPolicyModel model, final boolean used, boolean locked, WidgetStyle style) { this.policyUnit = policyUnit; this.model = model; this.used = used; this.locked = locked; this.style = style; getElement().setTitle(policyUnit.getDescription()); if (!locked && (policyUnit.isEnabled() || used)) { addDomHandler(event -> { PolicyUnitPanel sourcePanel = (PolicyUnitPanel) event.getSource(); NativeEvent nativeEvent = event.getNativeEvent(); showContextMenu(sourcePanel, nativeEvent.getClientX(), nativeEvent.getClientY()); event.stopPropagation(); event.preventDefault(); }, ContextMenuEvent.getType()); // enable d&d getElement().setDraggable(Element.DRAGGABLE_TRUE); // drag start addBitlessDomHandler(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.getWidget().getAbsoluteLeft(); int y = nativeEvent.getClientY() - sourcePanel.getWidget().getAbsoluteTop(); event.getDataTransfer().setDragImage(sourcePanel.getWidget().getElement(), x, y); }, DragStartEvent.getType()); } } public void initWidget() { FlowPanel namePanel = getNamePanel(policyUnit); if (!used) { namePanel.setStyleName(style.unusedPolicyUnitStyle()); } else { namePanel.setStyleName(style.usedFilterPolicyUnitStyle()); if (position != 0) { Label label = new Label(); label.setStyleName(style.positionLabelStyle()); namePanel.add(label); String labelText = null; if (position <= -1) { labelText = constants.firstFilter(); } else { labelText = constants.lastFilter(); } label.setText(labelText); Widget text = namePanel.getWidget(0); text.getElement().getStyle().setFloat(Style.Float.LEFT); text.getElement().getStyle().setPaddingRight(5, Unit.PX); } } if (!policyUnit.isEnabled()) { namePanel.getElement().getStyle().setOpacity(0.5); } setWidget(namePanel); } protected FlowPanel getNamePanel(PolicyUnit policyUnit) { FlowPanel panel = new FlowPanel(); Label label = new Label(policyUnit.getName()); if (!policyUnit.isInternal()) { Label extLabel = new Label(constants.externalPolicyUnitLabel()); extLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD); extLabel.getElement().getStyle().setPaddingLeft(5, Unit.PX); extLabel.getElement().getStyle().setPaddingRight(5, Unit.PX); extLabel.getElement().getStyle().setFloat(Style.Float.LEFT); panel.add(extLabel); } panel.add(label); if (!policyUnit.isEnabled()) { Label disabledLabel = new Label(constants.disabledPolicyUnit()); disabledLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD); disabledLabel.getElement().getStyle().setPaddingLeft(5, Unit.PX); panel.add(disabledLabel); } return panel; } protected void showContextMenu(PolicyUnitPanel sourcePanel, int clientX, int clientY) { MenuBar menuBar = createMenu(); fillMenuBar(menuBar); if (policyUnit.isEnabled()) { addSubMenu(menuBar); } menuPopup.setWidget(menuBar); menuPopup.setPopupPosition(clientX, clientY); menuPopup.show(); } protected void fillMenuBar(MenuBar menuBar) { if (used) { menuBar.addItem(constants.removeFilter(), () -> { model.removeFilter(policyUnit); menuPopup.hide(); }); } else { menuBar.addItem(constants.addFilter(), () -> { model.addFilter(policyUnit, used, 0); menuPopup.hide(); }); } } protected void addSubMenu(MenuBar menuBar) { MenuBar subMenu = new MenuBar(true); if (position != 0) { subMenu.addItem(constants.noPositionFilter(), () -> { model.addFilter(policyUnit, used, 0); menuPopup.hide(); }); } if (position >= 0) { subMenu.addItem(constants.firstFilter(), () -> { model.addFilter(policyUnit, used, -1); menuPopup.hide(); }); } if (position <= 0) { subMenu.addItem(constants.lastFilter(), () -> { model.addFilter(policyUnit, used, 1); menuPopup.hide(); }); } menuBar.addItem(constants.position(), subMenu); } protected MenuBar createMenu() { MenuBar menuBar = new MenuBar(true); menuBar.addItem(constants.actionItems(), (Command) null); menuBar.addSeparator(); return menuBar; } public int getPosition() { return position; } public void setPosition(int position) { 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; } } }