package org.ovirt.engine.ui.common.view.popup.permissions;
import java.util.ArrayList;
import org.ovirt.engine.core.aaa.ProfileEntry;
import org.ovirt.engine.core.common.businessentities.Role;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
import org.ovirt.engine.core.searchbackend.VdcUserConditionFieldAutoCompleter.UserOrGroup;
import org.ovirt.engine.ui.common.CommonApplicationConstants;
import org.ovirt.engine.ui.common.gin.AssetProvider;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.presenter.popup.permissions.AbstractPermissionsPopupPresenterWidget;
import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
import org.ovirt.engine.ui.common.widget.HasUiCommandClickHandlers;
import org.ovirt.engine.ui.common.widget.UiCommandButton;
import org.ovirt.engine.ui.common.widget.dialog.PopupNativeKeyPressHandler;
import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable;
import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxEditor;
import org.ovirt.engine.ui.common.widget.editor.TextBoxChanger;
import org.ovirt.engine.ui.common.widget.renderer.NameRenderer;
import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer;
import org.ovirt.engine.ui.common.widget.table.column.AbstractEntityModelTextColumn;
import org.ovirt.engine.ui.uicommonweb.HasCleanup;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.HasHandlers;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.cellview.client.LoadingStateChangeEvent.LoadingState;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
public abstract class AbstractPermissionsPopupView<T extends AdElementListModel> extends AbstractModelBoundPopupView<T>
implements AbstractPermissionsPopupPresenterWidget.ViewDef<T>, HasCleanup {
@SuppressWarnings("rawtypes")
interface ViewUiBinder extends UiBinder<SimpleDialogPanel, AbstractPermissionsPopupView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
public interface Style extends CssResource {
String alignBottomSearch();
}
/**
* This is the max width of a column in this dialogs
*/
private static final String MAX_COL_WIDTH = "260px"; //$NON-NLS-1$
@UiField
@WithElementId
public UiCommandButton searchButton;
@UiField(provided = true)
@Path("profile.selectedItem")
@WithElementId("profile")
public ListModelListBoxEditor<ProfileEntry> profileSelection;
@UiField(provided = true)
@Path("namespace.selectedItem")
@WithElementId("namespace")
public ListModelListBoxEditor<String> namespaceSelection;
@UiField(provided = true)
@Path("role.selectedItem")
@WithElementId("role")
public ListModelListBoxEditor<Role> roleSelection;
@UiField(provided = true)
@Ignore
@WithElementId
public EntityModelCellTable<ListModel> searchItems;
@UiField
@Ignore
@WithElementId
public RadioButton everyoneRadio;
@UiField
@Ignore
@WithElementId
public RadioButton specificUserRadio;
@UiField
@Ignore
@WithElementId
public RadioButton specificGroupRadio;
@UiField
@Ignore
@WithElementId
public RadioButton myGroupsRadio;
@UiField
@Path("searchString")
@WithElementId("searchString")
public TextBoxChanger searchStringEditor;
@UiField
public FlowPanel roleSelectionPanel;
@UiField
public ScrollPanel searchItemsScrollPanel;
@UiField
@Ignore
Label errorMessage;
@UiField
Style style;
private AbstractEntityModelTextColumn<DbUser> firstNameColumn;
private AbstractEntityModelTextColumn<DbUser> groupNameColumn;
private AbstractEntityModelTextColumn<DbUser> lastNameColumn;
private AbstractEntityModelTextColumn<DbUser> userNameColumn;
private AbstractEntityModelTextColumn<DbUser> displayNameColumn;
private PopupNativeKeyPressHandler nativeKeyPressHandler;
private static final CommonApplicationConstants constants = AssetProvider.getConstants();
public AbstractPermissionsPopupView(EventBus eventBus) {
super(eventBus);
initListBoxEditors();
searchItems = new EntityModelCellTable<>(true);
searchItems.enableColumnResizing();
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
generateIds();
searchStringEditor.setStyleName("");
initTable();
specificUserRadio.setValue(true);
everyoneRadio.setValue(false);
myGroupsRadio.setValue(false);
//Have to add these classes to the searchStringEditor as the UiBinder seems to remove them
searchStringEditor.addStyleName("form-control"); //$NON-NLS-1$
searchStringEditor.addStyleName(style.alignBottomSearch());
localize();
}
protected abstract void generateIds();
protected abstract T doFlush();
private void initListBoxEditors() {
profileSelection = new ListModelListBoxEditor<>(new NullSafeRenderer<ProfileEntry>() {
@Override
public String renderNullSafe(ProfileEntry object) {
return object.toString();
}
});
roleSelection = new ListModelListBoxEditor<>(new NameRenderer<Role>());
namespaceSelection = new ListModelListBoxEditor<>(new NullSafeRenderer<String>() {
@Override
protected String renderNullSafe(String object) {
return object;
}
});
}
private void initTable() {
groupNameColumn = new AbstractEntityModelTextColumn<DbUser>() {
@Override
public String getText(DbUser user) {
return user.getFirstName();
}
};
searchItems.addColumn(groupNameColumn, constants.groupNamePermissionsPopup(), MAX_COL_WIDTH);
displayNameColumn = new AbstractEntityModelTextColumn<DbUser>() {
@Override
public String getText(DbUser user) {
return user.getNote();
}
};
searchItems.addColumn(displayNameColumn, constants.displayNamePermissionsPopup(), MAX_COL_WIDTH);
// Table Entity Columns
firstNameColumn = new AbstractEntityModelTextColumn<DbUser>() {
@Override
public String getText(DbUser user) {
return user.getFirstName();
}
};
searchItems.addColumn(firstNameColumn, constants.firstNamePermissionsPopup(), MAX_COL_WIDTH);
lastNameColumn = new AbstractEntityModelTextColumn<DbUser>() {
@Override
public String getText(DbUser user) {
return user.getLastName();
}
};
searchItems.addColumn(lastNameColumn, constants.lastNamePermissionsPopup(), MAX_COL_WIDTH);
userNameColumn = new AbstractEntityModelTextColumn<DbUser>() {
@Override
public String getText(DbUser user) {
return user.getLoginName();
}
};
searchItems.addColumn(userNameColumn, constants.userNamePermissionsPopup(), MAX_COL_WIDTH);
}
@Override
public void userTypeChanged(UserOrGroup newType, boolean setRadioValue) {
boolean isUser = newType == UserOrGroup.User;
searchItems.ensureColumnVisible(firstNameColumn, constants.firstNamePermissionsPopup(), isUser, MAX_COL_WIDTH);
searchItems.ensureColumnVisible(groupNameColumn, constants.groupNamePermissionsPopup(), !isUser, MAX_COL_WIDTH);
searchItems.ensureColumnVisible(lastNameColumn, constants.lastNamePermissionsPopup(), isUser, MAX_COL_WIDTH);
searchItems.ensureColumnVisible(userNameColumn, constants.userNamePermissionsPopup(), isUser, MAX_COL_WIDTH);
searchItems.ensureColumnVisible(displayNameColumn, constants.displayNamePermissionsPopup(), !isUser,
MAX_COL_WIDTH);
if (setRadioValue) {
if (isUser) {
specificUserRadio.setValue(true, false);
} else {
specificGroupRadio.setValue(true, false);
}
}
}
void localize() {
searchButton.setLabel(constants.goPermissionsPopup());
}
@Override
public void edit(final T object) {
searchItems.setRowData(new ArrayList<EntityModel>());
searchItems.asEditor().edit(object);
}
@Override
public T flush() {
searchItems.flush();
return doFlush();
}
@Override
public void focusInput() {
searchStringEditor.setFocus(true);
}
@Override
public HasUiCommandClickHandlers getSearchButton() {
return searchButton;
}
@Override
public HasKeyPressHandlers getKeyPressSearchInputBox() {
return searchStringEditor;
}
@Override
public HasClickHandlers getEveryoneRadio() {
return everyoneRadio;
}
@Override
public HasClickHandlers getSpecificUserRadio() {
return specificUserRadio;
}
@Override
public HasClickHandlers getSpecificGroupRadio() {
return specificGroupRadio;
}
@Override
public HasClickHandlers getMyGroupsRadio() {
return myGroupsRadio;
}
@Override
public PopupNativeKeyPressHandler getNativeKeyPressHandler() {
return nativeKeyPressHandler;
}
@Override
public HasHandlers getSearchStringEditor() {
return searchStringEditor;
}
@Override
public void setPopupKeyPressHandler(PopupNativeKeyPressHandler handler) {
super.setPopupKeyPressHandler(handler);
this.nativeKeyPressHandler = handler;
}
@Override
public void changeStateOfElementsWhenAccessIsForEveryoneOrMyGroups(boolean isEveryone, boolean isMyGroups) {
boolean isEveryoneOrMyGroups = isEveryone || isMyGroups;
profileSelection.setEnabled(!isEveryoneOrMyGroups);
namespaceSelection.setEnabled(!isEveryoneOrMyGroups);
searchStringEditor.setEnabled(!isEveryoneOrMyGroups);
searchButton.getCommand().setIsExecutionAllowed(!isEveryoneOrMyGroups);
searchItems.setVisible(!isEveryone);
}
@Override
public HasValue<String> getSearchString() {
return searchStringEditor;
}
@Override
public void hideRoleSelection(boolean indic) {
roleSelectionPanel.setVisible(!indic);
}
@Override
public void hideEveryoneSelection(boolean indic) {
everyoneRadio.setVisible(!indic);
myGroupsRadio.setVisible(!indic);
}
@Override
public void setMessage(String message) {
super.setMessage(message);
errorMessage.setText(message);
}
@Override
public void setLoadingState(LoadingState state) {
searchItems.setLoadingState(state);
}
}