Vojtech Szocs has uploaded a new change for review.
Change subject: [WIP] webadmin: UI plugin dialog API improved
......................................................................
[WIP] webadmin: UI plugin dialog API improved
This patch improves the existing UI plugin API for handling dialogs.
(0) Minor dialog / UI plugin infrastructure improvements
(1) showDialog function signature and implementation improved
New signature:
showDialog(title, dialogToken, contentUrl, width, string)
Example usage:
showDialog('My Dialog', 'my-dialog',
'http://www.example.com/', '800px', '600px')
The implementation now uses WebAdmin's GWTP dialog infrastructure
via non-singleton DynamicUrlContentPopupPresenterWidget component
so that multiple dynamic dialog instances can be shown at a time
if necessary.
Facts about dialogs created via showDialog function:
- no close icon button (top-right corner of the dialog)
TODO: make this configurable via optional argument object
- no default footer buttons, users need to declare them explicitly
TODO: using hard-coded 'Close' button for now, need API for this
- support for dialog resizing using mouse
TODO: using resizeEnabled=false for now, make this configurable
via optional argument object
- need to support 'no buttons at all' scenario
TODO: hide dialog footer panel if no buttons are declared
(2) new function: setDialogContentUrl
New signature:
setDialogContentUrl(dialogToken, contentUrl)
Example usage:
setDialogContentUrl('my-dialog', 'http://www.foobar.com/')
(3) new function: closeDialog
New signature:
closeDialog(dialogToken)
Example usage:
closeDialog('my-dialog')
(X) TODO items
X1. address showDialog TODOs above
X2. design HTML5 Window.postMessage communication scheme in order
for iframe content to invoke plugin API functions, for example:
* <iframe> parent.postMessage
foo-plugin:closeDialog('my-dialog')
* <webadmin> obtain pluginApi object for foo-plugin
and invoke closeDialog('my-dialog') on it
Change-Id: I4654a25bed7122c45d432e3860ed710fa4ca3dd9
Signed-off-by: Vojtech Szocs <[email protected]>
---
M
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractModelBoundPopupPresenterWidget.java
M
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractPopupPresenterWidget.java
M
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/AbstractDialogPanel.java
M
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/SimpleDialogPanel.java
M
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PluginModule.java
M
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/PluginManager.java
M
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/api/PluginUiFunctions.java
A
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/CloseDynamicPopup.java
A
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/DynamicUrlContentPopupPresenterWidget.java
A
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/SetDynamicPopupContentUrl.java
A
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.java
A
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.ui.xml
12 files changed, 325 insertions(+), 40 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/17/11717/1
diff --git
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractModelBoundPopupPresenterWidget.java
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractModelBoundPopupPresenterWidget.java
index e07e64a..a0a7718 100644
---
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractModelBoundPopupPresenterWidget.java
+++
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractModelBoundPopupPresenterWidget.java
@@ -60,9 +60,6 @@
}
- // Indicates whether the popup has been disposed
- private boolean destroyed = false;
-
private final ModelBoundPopupHandler<T> popupHandler;
private T model;
@@ -274,17 +271,6 @@
button.getCommand().Execute();
}
}));
- }
- }
-
- /**
- * Hides the popup and unbinds the presenter widget, removing all handlers
registered via {@link #registerHandler}.
- */
- public void hideAndUnbind() {
- if (!destroyed) {
- getView().hide();
- unbind();
- destroyed = true;
}
}
diff --git
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractPopupPresenterWidget.java
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractPopupPresenterWidget.java
index f7211e7..786324a 100644
---
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractPopupPresenterWidget.java
+++
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractPopupPresenterWidget.java
@@ -38,6 +38,9 @@
}
+ // Indicates whether the popup has been disposed (non-singleton presenter
widgets only)
+ private boolean destroyed = false;
+
public AbstractPopupPresenterWidget(EventBus eventBus, V view) {
super(eventBus, view);
}
@@ -75,15 +78,25 @@
}
/**
- * Hides the popup view by default.
- * <p>
- * Non-singleton presenter widgets should override this method and make
sure that all handlers registered via
- * {@link #registerHandler} are removed.
+ * Close action callback, hides the popup view by default.
*/
protected void onClose() {
getView().hide();
}
+ /**
+ * Hides the popup view and releases all handlers registered via {@link
#registerHandler}.
+ * <p>
+ * This method is applicable to non-singleton presenter widgets only.
+ */
+ public void hideAndUnbind() {
+ if (!destroyed) {
+ getView().hide();
+ unbind();
+ destroyed = true;
+ }
+ }
+
protected void onKeyPress(NativeEvent event) {
if (KeyCodes.KEY_ENTER == event.getKeyCode()) {
handleEnterKey();
diff --git
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/AbstractDialogPanel.java
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/AbstractDialogPanel.java
index 92248fa..fa64d16 100644
---
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/AbstractDialogPanel.java
+++
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/AbstractDialogPanel.java
@@ -27,4 +27,6 @@
public abstract HasClickHandlers getCloseIconButton();
+ public abstract void setCloseIconButtonVisible(boolean visible);
+
}
diff --git
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/SimpleDialogPanel.java
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/SimpleDialogPanel.java
index 63d0944..34bfd45 100644
---
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/SimpleDialogPanel.java
+++
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/SimpleDialogPanel.java
@@ -151,6 +151,11 @@
}
@Override
+ public void setCloseIconButtonVisible(boolean visible) {
+ closeIconButton.setVisible(visible);
+ }
+
+ @Override
public int setTabIndexes(int nextTabIndex) {
int nbWidgets = footerButtonPanel.getWidgetCount();
for (int i = nbWidgets - 1; i >= 0; --i) {
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PluginModule.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PluginModule.java
index cc34308..3c8edc2 100644
---
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PluginModule.java
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PluginModule.java
@@ -6,15 +6,17 @@
import org.ovirt.engine.ui.webadmin.plugin.restapi.RestApiSessionManager;
import
org.ovirt.engine.ui.webadmin.section.main.presenter.DynamicUrlContentTabPresenter;
import
org.ovirt.engine.ui.webadmin.section.main.presenter.DynamicUrlContentTabProxyFactory;
+import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.DynamicUrlContentPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.view.DynamicUrlContentTabView;
+import
org.ovirt.engine.ui.webadmin.section.main.view.popup.DynamicUrlContentPopupView;
-import com.google.gwt.inject.client.AbstractGinModule;
import com.google.inject.Singleton;
+import com.gwtplatform.mvp.client.gin.AbstractPresenterModule;
/**
- * GIN module containing WebAdmin UI plugin infrastructure bindings.
+ * GIN module containing WebAdmin UI plugin infrastructure and related GWTP
presenter bindings.
*/
-public class PluginModule extends AbstractGinModule {
+public class PluginModule extends AbstractPresenterModule {
@Override
protected void configure() {
@@ -23,9 +25,14 @@
bind(PluginUiFunctions.class).in(Singleton.class);
bind(RestApiSessionManager.class).in(Singleton.class);
- // Dynamic tab component bindings
+ // Dynamic tab component
bind(DynamicUrlContentTabPresenter.ViewDef.class).to(DynamicUrlContentTabView.class);
bind(DynamicUrlContentTabProxyFactory.class).in(Singleton.class);
+
+ // Dynamic dialog component
+ bindPresenterWidget(DynamicUrlContentPopupPresenterWidget.class,
+ DynamicUrlContentPopupPresenterWidget.ViewDef.class,
+ DynamicUrlContentPopupView.class);
}
}
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/PluginManager.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/PluginManager.java
index 15decd8..96a38bc 100644
---
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/PluginManager.java
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/PluginManager.java
@@ -13,6 +13,8 @@
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.IFrameElement;
import com.google.gwt.dom.client.Style.BorderStyle;
@@ -162,10 +164,15 @@
public void enablePluginInvocation() {
canInvokePlugins = true;
- // Try to initialize all plugins
- for (Plugin plugin : getPlugins()) {
- initPlugin(plugin);
- }
+ // Try to initialize all plugins after the browser event loop returns
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ for (Plugin plugin : getPlugins()) {
+ initPlugin(plugin);
+ }
+ }
+ });
}
/**
@@ -423,9 +430,19 @@
uifunctio...@org.ovirt.engine.ui.webadmin.plugin.api.PluginUiFunctions::addMainTabActionButton(Lorg/ovirt/engine/ui/webadmin/plugin/entity/EntityType;Ljava/lang/String;Lorg/ovirt/engine/ui/webadmin/plugin/api/ActionButtonInterface;)(getEntityType(entityTypeName),label,actionButtonInterface);
}
},
- showDialog: function(title, contentUrl, width, height) {
+ showDialog: function(title, dialogToken, contentUrl, width,
height) {
if (canDoPluginAction(this.pluginName)) {
-
uifunctio...@org.ovirt.engine.ui.webadmin.plugin.api.PluginUiFunctions::showDialog(Ljava/lang/String;Ljava/lang/String;II)(title,contentUrl,width,height);
+
uifunctio...@org.ovirt.engine.ui.webadmin.plugin.api.PluginUiFunctions::showDialog(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(title,dialogToken,contentUrl,width,height);
+ }
+ },
+ setDialogContentUrl: function(dialogToken, contentUrl) {
+ if (canDoPluginAction(this.pluginName)) {
+
uifunctio...@org.ovirt.engine.ui.webadmin.plugin.api.PluginUiFunctions::setDialogContentUrl(Ljava/lang/String;Ljava/lang/String;)(dialogToken,contentUrl);
+ }
+ },
+ closeDialog: function(dialogToken) {
+ if (canDoPluginAction(this.pluginName)) {
+
uifunctio...@org.ovirt.engine.ui.webadmin.plugin.api.PluginUiFunctions::closeDialog(Ljava/lang/String;)(dialogToken);
}
},
loginUserName: function() {
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/api/PluginUiFunctions.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/api/PluginUiFunctions.java
index 8ceb183..4200fa5 100644
---
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/api/PluginUiFunctions.java
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/api/PluginUiFunctions.java
@@ -16,6 +16,9 @@
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.section.main.presenter.tab.MainTabClusterPresenter;
import
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.MainTabDataCenterPresenter;
import
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.MainTabDiskPresenter;
@@ -38,12 +41,12 @@
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.user.client.Window;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.gwtplatform.mvp.client.RequestTabsHandler;
import com.gwtplatform.mvp.client.proxy.RevealContentHandler;
+import com.gwtplatform.mvp.client.proxy.RevealRootPopupContentEvent;
/**
* Contains UI related functionality exposed to UI plugins through the plugin
API.
@@ -61,6 +64,8 @@
private final Provider<MainTabVirtualMachinePresenter>
mainTabVirtualMachinePresenterProvider;
private final Provider<MainTabTemplatePresenter>
mainTabTemplatePresenterProvider;
+ private final Provider<DynamicUrlContentPopupPresenterWidget>
dynamicUrlContentPopupPresenterWidgetProvider;
+
@Inject
public PluginUiFunctions(EventBus eventBus,
DynamicUrlContentTabProxyFactory dynamicUrlContentTabProxyFactory,
@@ -70,7 +75,8 @@
Provider<MainTabStoragePresenter> mainTabStoragePresenterProvider,
Provider<MainTabDiskPresenter> mainTabDiskPresenterProvider,
Provider<MainTabVirtualMachinePresenter>
mainTabVirtualMachinePresenterProvider,
- Provider<MainTabTemplatePresenter>
mainTabTemplatePresenterProvider) {
+ Provider<MainTabTemplatePresenter>
mainTabTemplatePresenterProvider,
+ Provider<DynamicUrlContentPopupPresenterWidget>
dynamicUrlContentPopupPresenterWidgetProvider) {
this.eventBus = eventBus;
this.dynamicUrlContentTabProxyFactory =
dynamicUrlContentTabProxyFactory;
this.mainTabDataCenterPresenterProvider =
mainTabDataCenterPresenterProvider;
@@ -80,6 +86,7 @@
this.mainTabDiskPresenterProvider = mainTabDiskPresenterProvider;
this.mainTabVirtualMachinePresenterProvider =
mainTabVirtualMachinePresenterProvider;
this.mainTabTemplatePresenterProvider =
mainTabTemplatePresenterProvider;
+ this.dynamicUrlContentPopupPresenterWidgetProvider =
dynamicUrlContentPopupPresenterWidgetProvider;
}
@Override
@@ -253,17 +260,43 @@
}
/**
- * Shows a dialog with content loaded from the given URL.
+ * Shows a modal dialog with content loaded from the given URL.
*/
- // TODO(vszocs) integrate with GWTP dialog infrastructure, using
window.open (non-modal) implementation for now
- public void showDialog(String title, String contentUrl, int width, int
height) {
- String windowFeatures = new StringBuilder("scrollbars=yes")
//$NON-NLS-1$
- .append(",width=").append(width) //$NON-NLS-1$
- .append(",height=").append(height) //$NON-NLS-1$
- .append(",left=").append((Window.getClientWidth() / 2) -
(width / 2)) //$NON-NLS-1$
- .append(",top=").append((Window.getClientHeight() / 2) -
(height / 2)) //$NON-NLS-1$
- .toString();
- Window.open(contentUrl, "_blank", windowFeatures); //$NON-NLS-1$
+ public void showDialog(String title, String dialogToken, String
contentUrl, String width, String height) {
+ DynamicUrlContentPopupPresenterWidget popup =
dynamicUrlContentPopupPresenterWidgetProvider.get();
+ // TODO(vszocs) control resizeEnabled via optional arguments object,
using resizeEnabled=false for now
+ popup.init(dialogToken, title, width, height, false);
+ popup.setContentUrl(contentUrl);
+
+ // TODO(vszocs) implement API for adding custom buttons, using
hard-coded 'Close' button for now
+ popup.addCloseButton("Close"); //$NON-NLS-1$
+
+ // 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(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ SetDynamicPopupContentUrlEvent.fire(PluginUiFunctions.this,
dialogToken, contentUrl);
+ }
+ });
+ }
+
+ /**
+ * Closes an existing modal dialog.
+ */
+ public void closeDialog(final String dialogToken) {
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ CloseDynamicPopupEvent.fire(PluginUiFunctions.this,
dialogToken);
+ }
+ });
}
}
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/CloseDynamicPopup.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/CloseDynamicPopup.java
new file mode 100644
index 0000000..09daed1
--- /dev/null
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/CloseDynamicPopup.java
@@ -0,0 +1,13 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup;
+
+import com.gwtplatform.dispatch.annotation.GenEvent;
+
+/**
+ * Event triggered when {@link DynamicUrlContentPopupPresenterWidget} should
be closed and disposed.
+ */
+@GenEvent
+public class CloseDynamicPopup {
+
+ String dialogToken;
+
+}
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/DynamicUrlContentPopupPresenterWidget.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/DynamicUrlContentPopupPresenterWidget.java
new file mode 100644
index 0000000..5b33ed3
--- /dev/null
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/DynamicUrlContentPopupPresenterWidget.java
@@ -0,0 +1,91 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup;
+
+import org.ovirt.engine.ui.common.presenter.AbstractPopupPresenterWidget;
+import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.CloseDynamicPopupEvent.CloseDynamicPopupHandler;
+import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.SetDynamicPopupContentUrlEvent.SetDynamicPopupContentUrlHandler;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.HasClickHandlers;
+import com.google.gwt.event.shared.EventBus;
+import com.google.inject.Inject;
+
+/**
+ * Implements a dialog with content loaded from the given URL.
+ * <p>
+ * This presenter widget is bound as non-singleton to allow showing multiple
dialog instances.
+ */
+public class DynamicUrlContentPopupPresenterWidget extends
AbstractPopupPresenterWidget<DynamicUrlContentPopupPresenterWidget.ViewDef>
implements SetDynamicPopupContentUrlHandler, CloseDynamicPopupHandler {
+
+ public interface ViewDef extends AbstractPopupPresenterWidget.ViewDef {
+
+ void init(String title, String width, String height, boolean
resizeEnabled);
+
+ void setContentUrl(String contentUrl);
+
+ HasClickHandlers addFooterButton(String label);
+
+ }
+
+ private String dialogToken;
+
+ @Inject
+ public DynamicUrlContentPopupPresenterWidget(EventBus eventBus, ViewDef
view) {
+ super(eventBus, view);
+ }
+
+ @Override
+ protected void onBind() {
+ super.onBind();
+
registerHandler(getEventBus().addHandler(SetDynamicPopupContentUrlEvent.getType(),
this));
+
registerHandler(getEventBus().addHandler(CloseDynamicPopupEvent.getType(),
this));
+ }
+
+ @Override
+ public void onSetDynamicPopupContentUrl(SetDynamicPopupContentUrlEvent
event) {
+ if (dialogTokenMatches(event.getDialogToken())) {
+ setContentUrl(event.getContentUrl());
+ }
+ }
+
+ @Override
+ public void onCloseDynamicPopup(CloseDynamicPopupEvent event) {
+ if (dialogTokenMatches(event.getDialogToken())) {
+ onClose();
+ }
+ }
+
+ boolean dialogTokenMatches(String value) {
+ return dialogToken != null && dialogToken.equals(value);
+ }
+
+ @Override
+ protected void onClose() {
+ hideAndUnbind();
+ }
+
+ @Override
+ protected void handleEscapeKey() {
+ // No-op, dynamic dialog cannot be closed with Escape key
+ }
+
+ public void init(String dialogToken, String title,
+ String width, String height, boolean resizeEnabled) {
+ this.dialogToken = dialogToken;
+ getView().init(title, width, height, resizeEnabled);
+ }
+
+ public void setContentUrl(String contentUrl) {
+ getView().setContentUrl(contentUrl);
+ }
+
+ public void addCloseButton(String label) {
+ registerHandler(getView().addFooterButton(label).addClickHandler(new
ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ onClose();
+ }
+ }));
+ }
+
+}
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/SetDynamicPopupContentUrl.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/SetDynamicPopupContentUrl.java
new file mode 100644
index 0000000..afc8c55
--- /dev/null
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/SetDynamicPopupContentUrl.java
@@ -0,0 +1,18 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup;
+
+import com.gwtplatform.dispatch.annotation.GenEvent;
+import com.gwtplatform.dispatch.annotation.Order;
+
+/**
+ * Event triggered when {@link DynamicUrlContentPopupPresenterWidget} should
update its content URL.
+ */
+@GenEvent
+public class SetDynamicPopupContentUrl {
+
+ @Order(1)
+ String dialogToken;
+
+ @Order(2)
+ String contentUrl;
+
+}
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.java
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.java
new file mode 100644
index 0000000..c2e8548
--- /dev/null
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.java
@@ -0,0 +1,73 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup;
+
+import org.ovirt.engine.ui.common.view.AbstractPopupView;
+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.webadmin.ApplicationResources;
+import
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.DynamicUrlContentPopupPresenterWidget;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.IFrameElement;
+import com.google.gwt.event.dom.client.HasClickHandlers;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.Label;
+import com.google.inject.Inject;
+
+public class DynamicUrlContentPopupView extends
AbstractPopupView<SimpleDialogPanel> implements
DynamicUrlContentPopupPresenterWidget.ViewDef {
+
+ interface ViewUiBinder extends UiBinder<SimpleDialogPanel,
DynamicUrlContentPopupView> {
+ ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
+ }
+
+ @UiField
+ Label titleLabel;
+
+ @UiField
+ IFrameElement iframeElement;
+
+ @Inject
+ public DynamicUrlContentPopupView(EventBus eventBus, ApplicationResources
resources) {
+ super(eventBus, resources);
+ initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
+ asWidget().setCloseIconButtonVisible(false);
+ }
+
+ @Override
+ public HasClickHandlers getCloseButton() {
+ return null;
+ }
+
+ @Override
+ public HasClickHandlers getCloseIconButton() {
+ return null;
+ }
+
+ @Override
+ public void setPopupKeyPressHandler(PopupNativeKeyPressHandler
keyPressHandler) {
+ asWidget().setKeyPressHandler(keyPressHandler);
+ }
+
+ @Override
+ public void init(String title, String width, String height, boolean
resizeEnabled) {
+ titleLabel.setText(title);
+ asWidget().setWidth(width);
+ asWidget().setHeight(height);
+ asWidget().enableResizeSupport(resizeEnabled);
+ }
+
+ @Override
+ public void setContentUrl(String contentUrl) {
+ iframeElement.setSrc(contentUrl);
+ }
+
+ @Override
+ public HasClickHandlers addFooterButton(String label) {
+ UiCommandButton button = new UiCommandButton(label);
+ asWidget().addFooterButton(button);
+ return button;
+ }
+
+}
diff --git
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.ui.xml
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.ui.xml
new file mode 100644
index 0000000..667d204
--- /dev/null
+++
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/DynamicUrlContentPopupView.ui.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
+ xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog">
+
+ <ui:style>
+ .iframe {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ border-style: none;
+ }
+ </ui:style>
+
+ <d:SimpleDialogPanel>
+ <d:header>
+ <g:Label ui:field="titleLabel" />
+ </d:header>
+
+ <d:content>
+ <g:HTMLPanel>
+ <iframe ui:field="iframeElement"
class="{style.iframe}" frameBorder="0" />
+ </g:HTMLPanel>
+ </d:content>
+ </d:SimpleDialogPanel>
+
+</ui:UiBinder>
--
To view, visit http://gerrit.ovirt.org/11717
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I4654a25bed7122c45d432e3860ed710fa4ca3dd9
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Vojtech Szocs <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches