Glyn
Glyn

Reputation: 1995

How to clear the RootPanel before displaying the next view

I am using GWT Java and I am trying to remove the PayPal Donate button (i.e., clear the RootPanel), which is part of an HTML form, when I move from the LoginView to another view. I found that I should use:

    RootPanel.get("payPalDonate").clear();
    RootPanel.get().clear();
    RootPanel.get().getElement().setInnerHTML("");

This does clear the form so it does not appear on the next view; however, when the next view is displayed the buttons, hyperlinks and the browser back button on the view do not work.

The code is in the :

private void checkWithServerIfSessionIdIsStillLegal(String sessionID) {

    rpc = (DBConnectionAsync) GWT.create(DBConnection.class);
    ServiceDefTarget target = (ServiceDefTarget) rpc;
    String moduleRelativeURL = GWT.getModuleBaseURL() + "MySQLConnection";
    target.setServiceEntryPoint(moduleRelativeURL);

    AsyncCallback<Account> callback = new AuthenticationHandler<Account>();
    rpc.loginFromSessionServer(callback);
}

class AuthenticationHandler<T> implements AsyncCallback<Account> {
    @Override
    public void onFailure(Throwable caught) {
        RootPanel.get().add(new LoginView());
    }

    @Override
    public void onSuccess(Account result) {
        if (result == null) {
            RootPanel.get().add(new LoginView());
        } else {
            //if (result.getLoggedIn()) {
                RootPanel.get().clear();
                //RootPanel.get().add(new SelectPersonView());
                RootPanel.get().add(new LoginView());
            //} else {
                //RootPanel.get().add(new LoginView());
            //}
        }
    }

}

public void onValueChange(ValueChangeEvent<String> event) {

    RootPanel.get("payPalDonate").clear();
    RootPanel.get().clear();
    RootPanel.get().getElement().setInnerHTML("");

    //Get the historyToken value
    String historyToken = event.getValue();

    //Check the historyToken
    if (historyToken.startsWith("!"))
        historyToken = historyToken.substring(1);

    if (historyToken.length() == 0) {   
        //Initial entry
        RootPanel.get().clear();
        RootPanel.get().add(new LoginView());
    } else if (historyToken.equals("login")) {
        RootPanel.get().clear();
        RootPanel.get().add(new LoginView());
    } else if (historyToken.equals("goToVideo")) {
        RootPanel.get().clear();
        Window.Location.replace("https://www.youtube.com/user/GlyndwrBartlett");
    } else if (historyToken.equals("goToMetawerx")) {
        RootPanel.get().clear();
        Window.Location.replace("https://www.metawerx.net/");
    } else if (historyToken.equals("goToPrivacy")) {
        RootPanel.get().clear();
        RootPanel.get().add(new SecurityAndPrivacyView());
    } else if ...

In the LoginView:

    initWidget(verticalPanel);
    RootPanel.get("payPalDonate");

In the html:

       <div style="margin:auto" id="payPalDonate">
            <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
                <input type="hidden" name="cmd" value="_s-xclick">
                <input type="image" src="https://www.paypalobjects.com/en_AU/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
                <img alt="" border="0" src="https://www.paypalobjects.com/en_AU/i/scr/pixel.gif" width="1" height="1">
            </form>
        </div>

Upvotes: 0

Views: 56

Answers (2)

Glyn
Glyn

Reputation: 1995

I am reading the link provided by Andrei. In the meantime I found the issues were being cased by:

RootPanel.get().getElement().setInnerHTML("");

I tried:

RootPanel.getBodyElement().removeChild(RootPanel.get("payPalDonate").getElement());

However, this cased the same issue. In the end I found this https://groups.google.com/forum/#!topic/google-web-toolkit/zVvY39blkY4

So I replaced the offending code with:

RootPanel.get("payPalDonate").setVisible(false);

And I placed the code in the LoginView just before I pass control to another view. Not the most elegant; however, it works until I digest the information provided by Andrei.

Upvotes: 0

Andrei Volgin
Andrei Volgin

Reputation: 41089

Typically in GWT the RootPanel is never cleared. When you start your app, you pass a container to the RootPanel, and then all the views are added to and removed from that container.

Personally, I use Activities and Places pattern for all of my apps. This link offers an example of how to change views within a main container.

Upvotes: 2

Related Questions