package org.ovirt.engine.ui.webadmin.plugin.api;
import java.util.List;
import org.ovirt.engine.ui.common.presenter.AddTabActionButtonEvent;
import org.ovirt.engine.ui.common.presenter.RedrawDynamicTabContainerEvent;
import org.ovirt.engine.ui.common.presenter.SetDynamicTabAccessibleEvent;
import org.ovirt.engine.ui.common.widget.AlertManager;
import org.ovirt.engine.ui.common.widget.Align;
import org.ovirt.engine.ui.common.widget.action.AbstractButtonDefinition;
import org.ovirt.engine.ui.common.widget.action.ActionButtonDefinition;
import org.ovirt.engine.ui.common.widget.panel.AlertPanel;
import org.ovirt.engine.ui.uicommonweb.models.ApplySearchStringEvent;
import org.ovirt.engine.ui.webadmin.plugin.entity.EntityObject;
import org.ovirt.engine.ui.webadmin.plugin.entity.EntityType;
import org.ovirt.engine.ui.webadmin.plugin.entity.TagObject;
import org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper;
import org.ovirt.engine.ui.webadmin.section.main.presenter.DynamicUrlContentTabProxyFactory;
import org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabPanelPresenter;
import org.ovirt.engine.ui.webadmin.section.main.presenter.SetDynamicTabContentUrlEvent;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.CloseDynamicPopupEvent;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.DynamicUrlContentPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.SetDynamicPopupContentUrlEvent;
import org.ovirt.engine.ui.webadmin.uicommon.model.TagModelProvider;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.GwtEvent.Type;
import com.google.gwt.event.shared.HasHandlers;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.gwtplatform.mvp.client.ChangeTabHandler;
import com.gwtplatform.mvp.client.RequestTabsHandler;
import com.gwtplatform.mvp.client.proxy.PlaceManager;
import com.gwtplatform.mvp.client.proxy.RevealContentHandler;
import com.gwtplatform.mvp.client.proxy.RevealRootPopupContentEvent;
import com.gwtplatform.mvp.shared.proxy.PlaceRequest;
/**
* Contains UI related functionality exposed to UI plugins through the plugin API.
*/
public class PluginUiFunctions implements HasHandlers {
private final EventBus eventBus;
private final DynamicUrlContentTabProxyFactory dynamicUrlContentTabProxyFactory;
private final Provider<DynamicUrlContentPopupPresenterWidget> dynamicUrlContentPopupPresenterWidgetProvider;
private final TagModelProvider tagModelProvider;
private final PlaceManager placeManager;
private final AlertManager alertManager;
@Inject
public PluginUiFunctions(EventBus eventBus,
DynamicUrlContentTabProxyFactory dynamicUrlContentTabProxyFactory,
Provider<DynamicUrlContentPopupPresenterWidget> dynamicUrlContentPopupPresenterWidgetProvider,
PlaceManager placeManager,
AlertManager alertManager,
TagModelProvider tagModelProvider) {
this.eventBus = eventBus;
this.dynamicUrlContentTabProxyFactory = dynamicUrlContentTabProxyFactory;
this.dynamicUrlContentPopupPresenterWidgetProvider = dynamicUrlContentPopupPresenterWidgetProvider;
this.tagModelProvider = tagModelProvider;
this.placeManager = placeManager;
this.alertManager = alertManager;
}
@Override
public void fireEvent(GwtEvent<?> event) {
eventBus.fireEvent(event);
}
/**
* Adds new dynamic main tab that shows contents of the given URL.
*/
public void addMainTab(String label, String historyToken,
String contentUrl, TabOptions options) {
addTab(MainTabPanelPresenter.TYPE_RequestTabs,
MainTabPanelPresenter.TYPE_ChangeTab,
MainTabPanelPresenter.TYPE_SetTabContent,
label, historyToken, true, contentUrl, options);
}
/**
* Adds new dynamic sub tab that shows contents of the given URL.
*/
public void addSubTab(EntityType entityType, String label,
String historyToken, String contentUrl, TabOptions options) {
Type<RequestTabsHandler> requestTabsEventType = entityType.getSubTabPanelRequestTabs();
Type<ChangeTabHandler> changeTabEventType = entityType.getSubTabPanelChangeTab();
Type<RevealContentHandler<?>> slot = entityType.getSubTabPanelContentSlot();
if (requestTabsEventType != null && changeTabEventType != null && slot != null) {
addTab(requestTabsEventType, changeTabEventType, slot,
label, historyToken, false, contentUrl, options);
}
}
void addTab(Type<RequestTabsHandler> requestTabsEventType,
Type<ChangeTabHandler> changeTabEventType,
Type<RevealContentHandler<?>> slot,
String label, String historyToken, boolean isMainTab,
String contentUrl, TabOptions options) {
// Create and bind tab presenter proxy
dynamicUrlContentTabProxyFactory.create(
requestTabsEventType, changeTabEventType, slot,
label, options.getPriority().floatValue(),
historyToken, isMainTab, contentUrl,
options.getAlignRight() ? Align.RIGHT : Align.LEFT,
options.getSearchPrefix());
// Redraw the corresponding tab container
RedrawDynamicTabContainerEvent.fire(this, requestTabsEventType);
}
/**
* Sets the content URL for existing dynamic tab.
*/
public void setTabContentUrl(final String historyToken, final String contentUrl) {
Scheduler.get().scheduleDeferred(() -> SetDynamicTabContentUrlEvent.fire(PluginUiFunctions.this,
historyToken, contentUrl));
}
/**
* Updates tab/place accessibility for existing dynamic tab.
*/
public void setTabAccessible(final String historyToken, final boolean tabAccessible) {
Scheduler.get().scheduleDeferred(() -> SetDynamicTabAccessibleEvent.fire(PluginUiFunctions.this,
historyToken, tabAccessible));
}
/**
* Adds new action button to standard table-based main tab.
*/
public void addMainTabActionButton(EntityType entityType, String label,
ActionButtonInterface actionButtonInterface) {
String historyToken = entityType.getMainTabHistoryToken();
if (historyToken != null) {
AddTabActionButtonEvent.fire(this, historyToken,
createButtonDefinition(label, actionButtonInterface));
}
}
/**
* Adds new action button to standard table-based sub tab.
*/
public void addSubTabActionButton(EntityType mainTabEntityType, EntityType subTabEntityType,
String label, ActionButtonInterface actionButtonInterface) {
String historyToken = mainTabEntityType.getSubTabHistoryToken(subTabEntityType);
if (historyToken != null) {
AddTabActionButtonEvent.fire(this, historyToken,
createButtonDefinition(label, actionButtonInterface));
}
}
<T> ActionButtonDefinition<T> createButtonDefinition(String label,
final ActionButtonInterface actionButtonInterface) {
return new AbstractButtonDefinition<T>(eventBus,
label, actionButtonInterface.getLocation()) {
@Override
public void onClick(List<T> selectedItems) {
actionButtonInterface.onClick().invoke(
EntityObject.arrayFrom(selectedItems), null);
}
@Override
public boolean isEnabled(List<T> selectedItems) {
return JsFunctionResultHelper.invokeAndGetResultAsBoolean(
actionButtonInterface.isEnabled(),
EntityObject.arrayFrom(selectedItems), null, true);
}
@Override
public boolean isAccessible(List<T> selectedItems) {
return JsFunctionResultHelper.invokeAndGetResultAsBoolean(
actionButtonInterface.isAccessible(),
EntityObject.arrayFrom(selectedItems), null, true);
}
};
}
/**
* Shows a modal dialog with content loaded from the given URL.
*/
public void showDialog(String title, String dialogToken, String contentUrl,
String width, String height, DialogOptions options) {
// Create and initialize the popup
DynamicUrlContentPopupPresenterWidget popup = dynamicUrlContentPopupPresenterWidgetProvider.get();
popup.init(dialogToken, title, width, height,
options.getCloseIconVisible(),
options.getCloseOnEscKey());
popup.setContentUrl(contentUrl);
// Add dialog buttons
JsArray<DialogButtonInterface> buttons = options.getButtons();
for (int i = 0; i < buttons.length(); i++) {
final DialogButtonInterface dialogButtonInterface = buttons.get(i);
if (dialogButtonInterface != null) {
popup.addFooterButton(dialogButtonInterface.getLabel(),
event -> dialogButtonInterface.onClick().invoke(null, null));
}
}
// Reveal the popup
RevealRootPopupContentEvent.fire(this, popup);
}
/**
* Sets the content URL for existing modal dialog.
*/
public void setDialogContentUrl(final String dialogToken, final String contentUrl) {
Scheduler.get().scheduleDeferred(() -> SetDynamicPopupContentUrlEvent.fire(PluginUiFunctions.this,
dialogToken, contentUrl));
}
/**
* Closes an existing modal dialog.
*/
public void closeDialog(final String dialogToken) {
Scheduler.get().scheduleDeferred(() -> CloseDynamicPopupEvent.fire(PluginUiFunctions.this,
dialogToken));
}
/**
* Reveals the application place denoted by {@code historyToken}.
*/
public void revealPlace(final String historyToken) {
Scheduler.get().scheduleDeferred(() -> placeManager.revealPlace(new PlaceRequest.Builder().nameToken(historyToken).build()));
}
/**
* Applies the given search string, which triggers transition to the corresponding application place.
*/
public void setSearchString(final String searchString) {
Scheduler.get().scheduleDeferred(() -> ApplySearchStringEvent.fire(PluginUiFunctions.this, searchString));
}
/**
* Shows an application-wide alert message.
*/
public void showAlert(final AlertPanel.Type type, final String message, final AlertOptions options) {
Scheduler.get().scheduleDeferred(() -> alertManager.showAlert(type, SafeHtmlUtils.fromString(message), options.getAutoHideMs().intValue()));
}
/**
* Returns the current locale string in <a href="http://tools.ietf.org/html/rfc5646">standard format</a>,
* e.g. {@code en-US}.
*/
public String getCurrentLocale() {
String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
// Replace "default" with "en_US"
if ("default".equals(currentLocale)) { //$NON-NLS-1$
currentLocale = "en_US"; //$NON-NLS-1$
}
// Replace "_" with "-"
currentLocale = currentLocale.replace('_', '-');
return currentLocale;
}
public TagObject getRootTagNode() {
return TagObject.from(tagModelProvider.getModel().getRootNode());
}
}