/* * Copyright 2012 Cedric Hauber * * 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 org.jboss.errai.mvp.client.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Target; /** * This annotation can be used to specify a function returning the title of a * place as a string, given the request. It can work in one of two ways. For * simple hard-coded titles see {@link Title}. * <p /> * 1) You can use it to annotate a static or non-static public method in your * presenter that returns a string (the title). This method can optionally * accept a {@link org.jboss.errai.mvp.client.places.PlaceRequest} parameter to * contain the place request for which the title is desired. It can also * optionally accept another parameter corresponding to your custom ginjector. * Using a static method is more efficient, as it doesn't force instantiation of * the associated presenter and view. Example of use: * * <pre> * {@code @}TitleFunction * static public String getTranslatedTitle( MyGinjector ginjector ) { * return ginjector.getTranslations().productTitle(); * } * * {@code @}TitleFunction * public String getTitle( PlaceRequest placeRequest ) { * prepareFromRequest( placeRequest ); * return "Email #" + getEmailId(); * } * </pre> * <p /> * 2) You can use it to annotate a static or non-static public method in your * presenter that returns {@code void} but accept a parameter of type * {@link org.jboss.errai.mvp.client.events.SetPlaceTitleHandler}. In this case, * your method is responsible for calling this handler's {@code onSetPlaceTitle} * with the title for this place, or {@code null} if the place doesn't have a * title. This is useful if the title can only be accessed in an asynchronous * fashion, for example following a call to the server. As above, your method * can accept a {@link org.jboss.errai.mvp.client.places.PlaceRequest} parameter * and your custom ginjector. Example of use: * * <pre> * {@code @}TitleFunction * public void getTitle( PlaceRequest placeRequest, final SetPlaceTitleHandler handler ) { * prepareFromRequest( placeRequest ); * dispatcher.execute( new GetUserNameAction( getUserId(), new AsyncCallback<GetUserNameResult>(){ * public void onSuccess(GetUserNameResult result) { * handler.onSetPlaceTitle( result.getUserName() ); * } * public void onFailure(Throwable caught) { * handler.onSetPlaceTitle(null); * } * } * } * </pre> * * @author Philippe Beaudoin */ @Target(ElementType.METHOD) public @interface TitleFunction { }