gwttwitter-bootstrapgwt-platform

What is the proper way to use gwt-bootstrap modal with gwt-platform?


I am constructiong an webapp with Google Web Toolkit using GWT-Platform and GWT-Bootstrap frameworks. Mostly it has been almost flawless until I tried to implement a popup. These frameworks' undestanding of popups seems to be quite different.

GWT-Platform expects a popup widget itself to be an instance of com.google.gwt.user.client.ui.PopupPanel when using the GWTP's RevealRootPopupContentEvent.fire(source, content) or a presenter's addToPopupSlot(child) method.

GWT-Bootstrap's Modal is used like any other widget that is added to the underlying panel but my goal is it to have a separate presenter and view and to possibly fetch it asynchrously with AsyncProvider.

I have tried to make it as a PresenterWidget and using addToSlot(slot, content) to reveal it but it doesn't look quite right. Not all of the styles are applied this way and the close icon (×), doesn't work for example.

I think I am not the first one trying to do something like that so maybe someone has figured out a proper way to make it work.

Thanks!


Solution

  • You have to create a view:

    public class MyPopupView extends PopupViewImpl implements MyView {
    
        protected Widget widget;
    
        public interface MyPopupViewUiBinder extends
                UiBinder<Widget, MyPopupView> {
        }
    
        @UiField(provided = true)
        Modal dialogBox;
    
        private MyPresenter presenter;
    
        @Inject
        public MyPopupView(final MyPopupViewUiBinder uiBinder,
                final EventBus eventBus) {
            super(eventBus);
            setUpDialog(); // Provides UiField => Before initWidgets
            initWidget(uiBinder.createAndBindUi(this));
        }
    
        // DialogBox must be overridden to let the presenter handle changes onUnload
        private void setUpDialog() {
            dialogBox = new Modal() {
    
                @Override
                protected void onUnload() {
                    MyPopupView.this.hide();
                }
            };
    
            dialogBox.setTitle("Some title");
        }
    
        @Override
        public void setPresenter(final MyPresenter presenter) {
            this.presenter = presenter;
        }
    
        @Override
        public final void hide() {
            dialogBox.hide();
            presenter.hide();
        }
    
        @Override
        public void setAutoHideOnNavigationEventEnabled(final boolean autoHide) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void setCloseHandler(
                final PopupViewCloseHandler popupViewCloseHandler) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void setPosition(final int left, final int top) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void show() {
            dialogBox.show();
        }
    
        @Override
        public void center() {
            dialogBox.show();
        }
    
        @Override
        public Widget asWidget() {
            return widget;
        }
    
        protected final void initWidget(final Widget widget) {
            this.widget = widget;
        }
    
    }
    

    And a UIBinder file:

    <!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:b='urn:import:com.github.gwtbootstrap.client.ui'>
    
        <b:Modal title="Some Title" ui:field="dialogBox">
            <!-- Your content -->
        </b:Modal>
    </ui:UiBinder>