package org.ovirt.engine.ui.common.presenter.popup.permissions;
import org.ovirt.engine.core.searchbackend.VdcUserConditionFieldAutoCompleter.UserOrGroup;
import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
import org.ovirt.engine.ui.common.widget.HasUiCommandClickHandlers;
import org.ovirt.engine.ui.common.widget.dialog.PopupNativeKeyPressHandler;
import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModel;
import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModel.AdSearchType;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.HasBlurHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.HasFocusHandlers;
import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.HasHandlers;
import com.google.gwt.user.cellview.client.LoadingStateChangeEvent.LoadingState;
import com.google.gwt.user.client.ui.HasValue;
public abstract class AbstractPermissionsPopupPresenterWidget<V extends AbstractPermissionsPopupPresenterWidget.ViewDef<M>, M extends AdElementListModel>
extends AbstractModelBoundPopupPresenterWidget<M, V> {
public interface ViewDef<A extends AdElementListModel> extends AbstractModelBoundPopupPresenterWidget.ViewDef<A> {
HasUiCommandClickHandlers getSearchButton();
HasKeyPressHandlers getKeyPressSearchInputBox();
HasValue<String> getSearchString();
HasClickHandlers getEveryoneRadio();
HasClickHandlers getSpecificUserRadio();
HasClickHandlers getSpecificGroupRadio();
HasClickHandlers getMyGroupsRadio();
HasHandlers getSearchStringEditor();
PopupNativeKeyPressHandler getNativeKeyPressHandler();
void changeStateOfElementsWhenAccessIsForEveryoneOrMyGroups(boolean isEveryone, boolean isMyGroups);
void hideRoleSelection(boolean indic);
void hideEveryoneSelection(boolean indic);
void userTypeChanged(UserOrGroup newType, boolean setRadioValue);
void setLoadingState(LoadingState state);
}
public AbstractPermissionsPopupPresenterWidget(EventBus eventBus, V view) {
super(eventBus, view);
}
@Override
public void init(final M model) {
// Let the parent do its work
super.init(model);
getView().getSearchButton().setCommand(model.getSearchCommand());
registerHandler(getView().getSearchButton().addClickHandler(event -> {
getView().setLoadingState(LoadingState.LOADING);
getView().getSearchButton().getCommand().execute();
}));
model.getSearchInProgress().getEntityChangedEvent().addListener((ev, sender, args) -> getView().getSearchButton()
.getCommand()
.setIsExecutionAllowed(!model.getSearchInProgress().getEntity()));
registerHandler(getView().getKeyPressSearchInputBox().addKeyPressHandler(event -> {
if (KeyCodes.KEY_ENTER == event.getNativeEvent().getKeyCode()) {
model.setSearchString(getView().getSearchString().getValue());
getView().getSearchButton().getCommand().execute();
}
}));
registerHandler(getView().getEveryoneRadio().addClickHandler(event -> {
model.setSearchType(AdSearchType.EVERYONE);
getView().changeStateOfElementsWhenAccessIsForEveryoneOrMyGroups(true, false);
getView().userTypeChanged(UserOrGroup.User, false);
model.setItems(null);
}));
registerHandler(getView().getMyGroupsRadio().addClickHandler(event -> {
model.setSearchType(AdSearchType.MY_GROUPS);
getView().changeStateOfElementsWhenAccessIsForEveryoneOrMyGroups(false, true);
getModel().getSearchMyGroupsCommand().execute();
getView().userTypeChanged(UserOrGroup.User, false);
model.setItems(null);
getView().setLoadingState(LoadingState.LOADING);
}));
registerHandler(getView().getSpecificUserRadio().addClickHandler(event -> {
model.setSearchType(AdSearchType.USER);
getView().changeStateOfElementsWhenAccessIsForEveryoneOrMyGroups(false, false);
getView().userTypeChanged(UserOrGroup.User, true);
model.setItems(null);
}));
registerHandler(getView().getSpecificGroupRadio().addClickHandler(event -> {
model.setSearchType(AdSearchType.GROUP);
getView().changeStateOfElementsWhenAccessIsForEveryoneOrMyGroups(false, false);
getView().userTypeChanged(UserOrGroup.Group, true);
model.setItems(null);
}));
model.getProfile().getSelectedItemChangedEvent().addListener((ev, sender, args) -> model.populateNamespaces());
model.getNamespace().getItemsChangedEvent().addListener((ev, sender, args) -> getView().getSearchButton()
.getCommand()
.setIsExecutionAllowed(model.availableNamespaces()));
model.getIsRoleListHiddenModel().getPropertyChangedEvent().addListener((ev, sender, args) -> getView().hideRoleSelection(Boolean.parseBoolean(model.getIsRoleListHiddenModel()
.getEntity().toString())));
getView().hideEveryoneSelection(model.getIsEveryoneSelectionHidden().getEntity());
model.getIsEveryoneSelectionHidden().getPropertyChangedEvent().addListener((ev, sender, args) -> getView().hideEveryoneSelection(Boolean.parseBoolean(model.getIsRoleListHiddenModel()
.getEntity().toString())));
PermissionPopupNativeKeyPressHandler keyPressHandler =
new PermissionPopupNativeKeyPressHandler(getView().getNativeKeyPressHandler(), model);
getView().setPopupKeyPressHandler(keyPressHandler);
}
class PermissionPopupNativeKeyPressHandler implements PopupNativeKeyPressHandler {
private final PopupNativeKeyPressHandler decorated;
private final M model;
private boolean hasFocus = false;
public PermissionPopupNativeKeyPressHandler(PopupNativeKeyPressHandler decorated, M model) {
this.decorated = decorated;
this.model = model;
((HasFocusHandlers) getView().getSearchStringEditor()).addFocusHandler(event -> hasFocus = true);
((HasBlurHandlers) getView().getSearchStringEditor()).addBlurHandler(event -> hasFocus = false);
}
@Override
public void onKeyPress(NativeEvent event) {
if (hasFocus && KeyCodes.KEY_ENTER == event.getKeyCode()) {
model.setSearchString(getView().getSearchString().getValue());
getView().getSearchButton().getCommand().execute();
} else {
decorated.onKeyPress(event);
}
}
}
@Override
protected void onReveal() {
super.onReveal();
UserOrGroup searchType = UserOrGroup.User;
if (getModel().getSearchType() == AdSearchType.GROUP) {
searchType = UserOrGroup.Group;
}
getView().userTypeChanged(searchType, true);
}
}