Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GWT 2.1 Places example without Activities

Tags:

gwt

does anyone have any examples of how to using Places without using activities for history management. I knocked something up quickly and can see the url changing with browser-back and browser-forward clicks but the display doesn't go anywhere.

I'm using a DecoratedTabPanel and have a SelectionHandler that fires off getPlaceController().goTo(place).

Any ideas would be useful.

like image 669
K2J Avatar asked Feb 02 '11 22:02

K2J


1 Answers

Here is a simple piece of code that I've made to demonstrate what you expected. It's based on the GWT and MVP Development document (GWT and MVP)

In this example you navigate between two tabs. On selection, a new history item is created (without any activity). As long as you use browser buttons to go back/forward the page will be updated correctly.

I have defined one place, one activity and its view. I've adjusted AppActivityMapper, AppActivityManager and ClientFactory to my needs. The code is lightweight and doesn't need comments to be understood. I've only put some explanations when it was needed, but if it's not clear do not hesitate to ask.

ExampleView.java

public interface ExampleView extends IsWidget {
    void selectTab(int index);
}

ExampleViewImpl.java

public class ExampleViewImpl extends Composite implements ExampleView, SelectionHandler<Integer> {

private DecoratedTabPanel panel;

public ExampleViewImpl() {
    panel = new DecoratedTabPanel();

    initComposite();

    initWidget(panel);
}

private void initComposite() {              
    panel.add(new HTML("Content 1"), "Tab 1");
    panel.add(new HTML("Content 2"), "Tab 2");

    panel.selectTab(0);

    panel.addSelectionHandler(this);
}

@Override
public void selectTab(int index) {
    if (index >=0 && index < panel.getWidgetCount()) {
        if (index != panel.getTabBar().getSelectedTab()) {
            panel.selectTab(index);
        }
    }
}

@Override
public void onSelection(SelectionEvent<Integer> event) {
    // Fire an history event corresponding to the tab selected
    switch (event.getSelectedItem()) {
    case 0:
        History.newItem("thetabplace:1");
        break;
    case 1:
        History.newItem("thetabplace:2");
        break;
    }
}
}

ClientFactory.java

public class ClientFactory {
private final EventBus eventBus = new SimpleEventBus();
private final PlaceController placeController = new PlaceController(eventBus);
private final ExampleViewImpl example = new ExampleViewImpl();

public EventBus getEventBus() {
    return this.eventBus;
}

public PlaceController getPlaceController() {
    return this.placeController;
}

public ExampleViewImpl getExampleView() {
    return example;
}
}

ExampleActivity.java

public class ExampleActivity extends AbstractActivity {

private ExampleView view;
private ClientFactory factory;

public ExampleActivity(ExamplePlace place, ClientFactory factory) {
    // Get the factory reference
    this.factory = factory;

    // Get the reference to the view
    view = this.factory.getExampleView();

    // Select the tab corresponding to the token value
    if (place.getToken() != null) {
        // By default the first tab is selected
        if (place.getToken().equals("") || place.getToken().equals("1")) {
            view.selectTab(0);
        } else if (place.getToken().equals("2")) {
            view.selectTab(1);
        }
    }
}

@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
    // Attach this view to the application container
    panel.setWidget(view);
}
}

ExamplePlace.java

/**
 * Just an very basic place
 */
public class ExamplePlace extends Place {
// The token corresponding to an action
private String token;

// This place should use a token to identify a view behavior
public ExamplePlace(String token) {
    this.token = token;
}

// Return the current token
public String getToken() {
    return token;
}

// Custom prefix to break the default name : ExamplePlace
// So that the history token will be thetabplace:token
// and not any more : ExamplePlace:token
@Prefix(value="thetabplace")
public static class Tokenizer implements PlaceTokenizer<ExamplePlace> {
    @Override
    public String getToken(ExamplePlace place) {
        return place.getToken();
    }

    @Override
    public ExamplePlace getPlace(String token) {
        return new ExamplePlace(token);
    }
}
}

AppActivityMapper.java

public class AppActivityMapper implements ActivityMapper {
private ClientFactory clientFactory;

public AppActivityMapper(ClientFactory clientFactory) {
    super();
    this.clientFactory = clientFactory;
}

@Override
public Activity getActivity(Place place) {
    if (place instanceof ExamplePlace) {
        return new ExampleActivity((ExamplePlace) place, clientFactory);
    }
    return null;
}
}

AppPlaceHistoryMapper.java

@WithTokenizers({ExamplePlace.Tokenizer.class})
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper
{
}

All together

private Place defaultPlace = new ExamplePlace("1");
private SimplePanel appWidget = new SimplePanel();

public void onModuleLoad() {
    ClientFactory clientFactory = new ClientFactory();
    EventBus eventBus = clientFactory.getEventBus();
    PlaceController placeController = clientFactory.getPlaceController();

    // Start ActivityManager for the main widget with our ActivityMapper
    ActivityMapper activityMapper = new AppActivityMapper(clientFactory);
    ActivityManager activityManager = new ActivityManager(activityMapper, eventBus);
    activityManager.setDisplay(appWidget);

    // Start PlaceHistoryHandler with our PlaceHistoryMapper
    AppPlaceHistoryMapper historyMapper= GWT.create(AppPlaceHistoryMapper.class);
    PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper);
    historyHandler.register(placeController, eventBus, defaultPlace);

    RootPanel.get().add(appWidget);
    // Goes to the place represented on URL else default place
    historyHandler.handleCurrentHistory();
}
like image 97
Naoj Avatar answered Oct 15 '22 22:10

Naoj