/* * Copyright 2011 ArcBees Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.gwtplatform.mvp.client.gin; import com.google.gwt.inject.client.AbstractGinModule; import com.google.inject.Singleton; import com.gwtplatform.mvp.client.Presenter; import com.gwtplatform.mvp.client.PresenterWidget; import com.gwtplatform.mvp.client.View; import com.gwtplatform.mvp.client.proxy.Proxy; public abstract class AbstractPresenterModule extends AbstractGinModule { public AbstractPresenterModule() { super(); } /** * Convenience method for binding a singleton presenter with its proxy, when * using automatically generated proxy classes and non-singleton views. * <p/> * <b>Important!</b> This is only be meant to be used by presenters associated * with non-singleton views, for example when the same view class is reused * with many presenters. As such, you will need to also use the * {@link #bindSharedView} method. If the view class is use only by one * presenter, you should consider using * {@link #bindPresenter(Class, Class, Class, Class, Class)} instead. * * @param <P> The {@link Presenter} interface type. * @param <Proxy_> The {@link Proxy} type. * @param presenterImpl The {@link Presenter} interface. * @param proxy The {@link Proxy} interface, which will lead to an * automatically generated proxy classes. */ protected <P extends Presenter<?, ?>, Proxy_ extends Proxy<P>> void bindPresenter( Class<P> presenter, Class<? extends P> presenterImpl, Class<Proxy_> proxy) { bind(presenterImpl).in(Singleton.class); bind(proxy).asEagerSingleton(); bind(presenter).to(presenterImpl); } /** * Convenience method for binding a singleton presenter with its view and its * proxy, when using automatically generated proxy classes. * * @param <P> The {@link Presenter} interface type. * @param <V> The {@link View} interface type. * @param <Proxy_> The {@link Proxy} type. * @param presenter The {@link Presenter} interface. * @param presenterImpl The {@link Presenter} implementation (a singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (a singleton). * @param proxy The {@link Proxy} interface, which will lead to an * automatically generated proxy classes. */ protected <P extends Presenter<?, ?>, V extends View, Proxy_ extends Proxy<P>> void bindPresenter( Class<P> presenter, Class<? extends P> presenterImpl, Class<V> view, Class<? extends V> viewImpl, Class<Proxy_> proxy) { bind(presenterImpl).in(Singleton.class); bind(viewImpl).in(Singleton.class); bind(proxy).asEagerSingleton(); bind(presenter).to(presenterImpl); bind(view).to(viewImpl); } /** * Convenience method for binding a singleton presenter with its proxy, when * using automatically generated proxy classes and non-singleton views. * <p/> * <b>Important!</b> This is only be meant to be used by presenters associated * with non-singleton views, for example when the same view class is reused * with many presenters. As such, you will need to also use the * {@link #bindSharedView} method. If the view class is use only by one * presenter, you should consider using * {@link #bindPresenter(Class, Class, Class, Class)} instead. * * @param <P> The {@link Presenter} class type. * @param <Proxy_> The {@link Proxy} type. * @param presenterImpl The {@link Presenter} implementation (a singleton). * @param proxy The {@link Proxy} interface, which will lead to an * automatically generated proxy classes. */ protected <P extends Presenter<?, ?>, Proxy_ extends Proxy<P>> void bindPresenter( Class<P> presenterImpl, Class<Proxy_> proxy) { bind(presenterImpl).in(Singleton.class); bind(proxy).asEagerSingleton(); } /** * Convenience method for binding a singleton presenter with its view and its * proxy, when using automatically generated proxy classes. * * @param <P> The {@link Presenter} class type. * @param <V> The {@link View} interface type. * @param <Proxy_> The {@link Proxy} type. * @param presenterImpl The {@link Presenter} implementation (a singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (a singleton). * @param proxy The {@link Proxy} interface, which will lead to an * automatically generated proxy classes. */ protected <P extends Presenter<?, ?>, V extends View, Proxy_ extends Proxy<P>> void bindPresenter( Class<P> presenterImpl, Class<V> view, Class<? extends V> viewImpl, Class<Proxy_> proxy) { bind(presenterImpl).in(Singleton.class); bind(viewImpl).in(Singleton.class); bind(proxy).asEagerSingleton(); bind(view).to(viewImpl); } /** * Convenience method for binding a singleton presenter with its proxy, when * using custom-made proxy classes and non-singleton views. * <p/> * <b>Important!</b> This is only be meant to be used by presenters associated * with non-singleton views, for example when the same view class is reused * with many presenters. As such, you will need to also use the * {@link #bindSharedView} method. If the view class is use only by one * presenter, you should consider using * {@link #bindPresenterCustomProxy(Class, Class, Class, Class, Class, Class)} * instead. * * @param <P> The {@link Presenter} interface type. * @param <Proxy_> The {@link Proxy} type. * @param presenter The {@link Presenter} interface. * @param presenterImpl The {@link Presenter} implementation (a singleton). * @param proxy The {@link Proxy} interface. * @param proxyImpl The {@link Proxy} implementation (a singleton). */ protected <P extends Presenter<?, ?>, Proxy_ extends Proxy<P>> void bindPresenterCustomProxy( Class<P> presenter, Class<? extends P> presenterImpl, Class<Proxy_> proxy, Class<? extends Proxy_> proxyImpl) { bind(presenterImpl).in(Singleton.class); bind(proxyImpl).asEagerSingleton(); bind(presenter).to(presenterImpl); bind(proxy).to(proxyImpl); } /** * Convenience method for binding a singleton presenter with its view and its * proxy, when using custom-made proxy classes. * * @param <P> The {@link Presenter} interface type. * @param <V> The {@link View} interface type. * @param <Proxy_> The {@link Proxy} type. * @param presenter The {@link Presenter} interface. * @param presenterImpl The {@link Presenter} implementation (a singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (a singleton). * @param proxy The {@link Proxy} interface. * @param proxyImpl The {@link Proxy} implementation (a singleton). */ protected <P extends Presenter<?, ?>, V extends View, Proxy_ extends Proxy<P>> void bindPresenterCustomProxy( Class<P> presenter, Class<? extends P> presenterImpl, Class<V> view, Class<? extends V> viewImpl, Class<Proxy_> proxy, Class<? extends Proxy_> proxyImpl) { bind(presenterImpl).in(Singleton.class); bind(viewImpl).in(Singleton.class); bind(proxyImpl).asEagerSingleton(); bind(presenter).to(presenterImpl); bind(view).to(viewImpl); bind(proxy).to(proxyImpl); } /** * Convenience method for binding a singleton presenter with its proxy, when * using custom-made proxy classes and non-singleton views. * <p/> * <b>Important!</b> This is only be meant to be used by presenters associated * with non-singleton views, for example when the same view class is reused * with many presenters. As such, you will need to also use the * {@link #bindSharedView} method. If the view class is used only by one * presenter, you should consider using * {@link #bindPresenterCustomProxy(Class, Class, Class, Class, Class)} * instead. * * @param <P> The {@link Presenter} class type. * @param <Proxy_> The {@link Proxy} type. * @param presenterImpl The {@link Presenter} implementation (a singleton). * @param proxy The {@link Proxy} interface. * @param proxyImpl The {@link Proxy} implementation (a singleton). */ protected <P extends Presenter<?, ?>, Proxy_ extends Proxy<P>> void bindPresenterCustomProxy( Class<P> presenterImpl, Class<Proxy_> proxy, Class<? extends Proxy_> proxyImpl) { bind(presenterImpl).in(Singleton.class); bind(proxyImpl).asEagerSingleton(); bind(proxy).to(proxyImpl); } /** * Convenience method for binding a singleton presenter with its view and its * proxy, when using custom-made proxy classes. * * @param <P> The {@link Presenter} class type. * @param <V> The {@link View} interface type. * @param <Proxy_> The {@link Proxy} type. * @param presenterImpl The {@link Presenter} implementation (a singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (a singleton). * @param proxy The {@link Proxy} interface. * @param proxyImpl The {@link Proxy} implementation (a singleton). */ protected <P extends Presenter<?, ?>, V extends View, Proxy_ extends Proxy<P>> void bindPresenterCustomProxy( Class<P> presenterImpl, Class<V> view, Class<? extends V> viewImpl, Class<Proxy_> proxy, Class<? extends Proxy_> proxyImpl) { bind(presenterImpl).in(Singleton.class); bind(viewImpl).in(Singleton.class); bind(proxyImpl).asEagerSingleton(); bind(view).to(viewImpl); bind(proxy).to(proxyImpl); } /** * Convenience method for binding a non-singleton {@link PresenterWidget} with * its {@link View}. * * @param <P> The {@link PresenterWidget} interface type. * @param <V> The {@link View} interface type. * @param presenter The {@link PresenterWidget} interface. * @param presenterImpl The {@link PresenterWidget} implementation (NOT a * singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (NOT a singleton). */ protected <P extends PresenterWidget<?>, V extends View> void bindPresenterWidget( Class<P> presenter, Class<? extends P> presenterImpl, Class<V> view, Class<? extends V> viewImpl) { bind(presenter).to(presenterImpl); bind(view).to(viewImpl); } /** * Convenience method for binding a non-singleton {@link PresenterWidget} with * its {@link View}. * * @param <P> The {@link PresenterWidget} class type. * @param <V> The {@link View} interface type. * @param presenterImpl The {@link PresenterWidget} implementation (NOT a * singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (NOT a singleton). */ protected <P extends PresenterWidget<?>, V extends View> void bindPresenterWidget( Class<P> presenterImpl, Class<V> view, Class<? extends V> viewImpl) { bind(presenterImpl); bind(view).to(viewImpl); } /** * Convenience method for binding a non-singleton {@link PresenterWidget} that * is created via a factory to its {@link View}, which is also created via a * factory. * * @param <P> The type of the {@link PresenterWidget} factory. * @param <V> The type of the {@link View} factory. * @param presenterFactory The interface to the {@link PresenterWidget} * factory. * @param presenterFactoryImpl The implementation of the * {@link PresenterWidget} factory. * @param viewFactory The interface to the {@link View} factory. * @param viewFactoryImpl The implementation of the {@link View} factory. */ protected <P, V> void bindPresenterWidgetFactory(Class<P> presenterFactory, Class<? extends P> presenterFactoryImpl, Class<V> viewFactory, Class<? extends V> viewFactoryImpl) { bind(presenterFactory).to(presenterFactoryImpl).in(Singleton.class); bind(viewFactory).to(viewFactoryImpl).in(Singleton.class); } /** * Bind a view interface to its implementation in a non-singleton manner. * <p/> * <b>Important!</b> This is only be meant to be used for presenter associated * with non-singleton views, for example when the same view class is reused * with many presenters. As such, you will use this method with * {@link #bindPresenter(Class, Class)}, * {@link #bindPresenter(Class, Class, Class)}, * {@link #bindPresenterCustomProxy(Class, Class, Class)}, or * {@link #bindPresenterCustomProxy(Class, Class, Class, Class)}, If the view * class is use only by one presenter, you should consider using * {@link #bindPresenter(Class, Class, Class, Class, Class)} instead. * * @param <V> The {@link View} interface type. * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (not a singleton). */ protected <V extends View> void bindSharedView(Class<V> view, Class<? extends V> viewImpl) { bind(view).to(viewImpl); } /** * Convenience method for binding a singleton {@link PresenterWidget} with its * {@link View}. * <p/> * <b>Important!</b> If you want to use the same {@link PresenterWidget} in * many different places, you should consider making it non-singleton with * {@link #bindPresenterWidget}. It is possible to use the same singleton * {@link PresenterWidget} in different presenters, as long as these are not * simultaneously visible. Also, if you do this, you must make sure to set the * singleton presenter widget as content in its containing presenter * {@link Presenter#onReveal} and to remove it in the * {@link Presenter#onHide}. * * @param <P> The {@link PresenterWidget} interface type. * @param <V> The {@link View} interface type. * @param presenter The {@link PresenterWidget} interface (a singleton). * @param presenterImpl The {@link PresenterWidget} implementation (a * singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (a singleton). */ protected <P extends PresenterWidget<?>, V extends View> void bindSingletonPresenterWidget( Class<P> presenter, Class<? extends P> presenterImpl, Class<V> view, Class<? extends V> viewImpl) { bind(presenter).to(presenterImpl).in(Singleton.class); bind(view).to(viewImpl).in(Singleton.class); } /** * Convenience method for binding a singleton {@link PresenterWidget} with its * {@link View}. * <p/> * <b>Important!</b> If you want to use the same {@link PresenterWidget} in * many different places, you should consider making it non-singleton with * {@link #bindPresenterWidget}. It is possible to use the same singleton * {@link PresenterWidget} in different presenters, as long as these are not * simultaneously visible. Also, if you do this, you must make sure to set the * singleton presenter widget as content in its containing presenter * {@link Presenter#onReveal} and to remove it in the * {@link Presenter#onHide}. * * @param <P> The {@link PresenterWidget} class type. * @param <V> The {@link View} interface type. * @param presenterImpl The {@link PresenterWidget} implementation (a * singleton). * @param view The {@link View} interface. * @param viewImpl The {@link View} implementation (a singleton). */ protected <P extends PresenterWidget<?>, V extends View> void bindSingletonPresenterWidget( Class<P> presenterImpl, Class<V> view, Class<? extends V> viewImpl) { bind(presenterImpl).in(Singleton.class); bind(view).to(viewImpl).in(Singleton.class); } }