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

Reply via email to