All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.gwt.user.client.History Maven / Gradle / Ivy

Go to download

A mocked implementation for GWT-2.5.1 that can run in the JVM to allow integration testing

There is a newer version: 0.1.7
Show newest version
/*
 * Copyright 2008 Google 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.google.gwt.user.client;

import java.util.ArrayList;
import java.util.List;

import com.google.common.collect.Lists;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.impl.HistoryImpl;

/**
 * This class allows you to interact with the browser's history stack. Each
 * "item" on the stack is represented by a single string, referred to as a
 * "token". You can create new history items (which have a token associated with
 * them when they are created), and you can programmatically force the current
 * history to move back or forward.
 *
 * 

* In order to receive notification of user-directed changes to the current * history item, implement the {@link ValueChangeHandler} interface and attach * it via {@link #addValueChangeHandler(ValueChangeHandler)}. *

* *

*

Example

* {@example com.google.gwt.examples.HistoryExample} *

* *

*

URL Encoding

* Any valid characters may be used in the history token and will survive * round-trips through {@link #newItem(String)} to {@link #getToken()}/ * {@link ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)} * , but most will be encoded in the user-visible URL. The following US-ASCII * characters are not encoded on any currently supported browser (but may be in * the future due to future browser changes): *
    *
  • a-z *
  • A-Z *
  • 0-9 *
  • ;,/?:@&=+$-_.!~*() *
*

*/ public class History { private static HistoryImpl impl; static { impl = GWT.create(HistoryImpl.class); // if (!impl.init()) { // // Set impl to null as a flag to no-op future calls. // impl = null; // // // Tell the user. // GWT.log("Unable to initialize the history subsystem; did you " // + "include the history frame in your host page? Try " // + ""); // } } /** * Adds a listener to be informed of changes to the browser's history stack. * * @param listener * the listener to be added * @deprecated use {@link History#addValueChangeHandler(ValueChangeHandler)} instead */ @Deprecated public static void addHistoryListener(HistoryListener listener) { if (impl != null) { BaseListenerWrapper.WrapHistory.add(listener); } } static List> historyHandlers = Lists.newArrayList(); public static void clearHistoryHandlers() { historyHandlers.clear(); } /** * Adds a {@link com.google.gwt.event.logical.shared.ValueChangeEvent} handler * to be informed of changes to the browser's history stack. * * @param handler * the handler * @return the registration used to remove this value change handler */ public static HandlerRegistration addValueChangeHandler( final ValueChangeHandler handler) { historyHandlers.add(handler); return new HandlerRegistration() { @Override public void removeHandler() { historyHandlers.remove(handler); } }; } /** * Programmatic equivalent to the user pressing the browser's 'back' button. * * Note that this does not work correctly on Safari 2. */ public static native void back() /*-{ $wnd.history.back(); }-*/; /** * Encode a history token for use as part of a URI. * * @param historyToken * the token to encode * @return the encoded token, suitable for use as part of a URI */ public static String encodeHistoryToken(String historyToken) { return impl != null ? impl.encodeFragment(historyToken) : historyToken; } /** * Fire * {@link ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)} * events with the current history state. This is most often called at the end * of an application's * {@link com.google.gwt.core.client.EntryPoint#onModuleLoad()} to inform * history handlers of the initial application state. */ public static void fireCurrentHistoryState() { for (final ValueChangeHandler handler : new ArrayList>(historyHandlers)) { ValueChangeEvent.getType(); ValueChangeEvent.fire(new HasValueChangeHandlers() { @Override public void fireEvent(GwtEvent event) { handler.onValueChange((ValueChangeEvent) event); } @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) { return null; } }, Window.Location.getHash()); } } /** * Programmatic equivalent to the user pressing the browser's 'forward' * button. */ public static native void forward() /*-{ $wnd.history.forward(); }-*/; /** * Gets the current history token. The handler will not receive a * {@link ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)} * event for the initial token; requiring that an application request the * token explicitly on startup gives it an opportunity to run different * initialization code in the presence or absence of an initial token. * * @return the initial token, or the empty string if none is present. */ public static String getToken() { return Window.Location.getHash(); } /** * Adds a new browser history entry. Calling this method will cause * {@link ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)} * to be called as well. * * @param historyToken * the token to associate with the new history item */ public static void newItem(String historyToken) { newItem(historyToken, true); } /** * Adds a new browser history entry. Calling this method will cause * {@link ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)} * to be called as well if and only if issueEvent is true. * * @param historyToken * the token to associate with the new history item * @param issueEvent * true if a * {@link ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)} * event should be issued */ public static void newItem(String historyToken, boolean issueEvent) { if (impl != null) { impl.newItem(historyToken, issueEvent); } } /** * Call all history handlers with the specified token. Note that this does not * change the history system's idea of the current state and is only kept for * backward compatibility. To fire history events for the initial state of the * application, instead call {@link #fireCurrentHistoryState()} from the * application {@link com.google.gwt.core.client.EntryPoint#onModuleLoad()} * method. * * @param historyToken * history token to fire events for * @deprecated Use {@link #fireCurrentHistoryState()} instead. */ @Deprecated public static void onHistoryChanged(String historyToken) { if (impl != null) { impl.fireHistoryChangedImpl(historyToken); } } /** * Removes a history listener. * * @param listener * the listener to be removed */ @Deprecated public static void removeHistoryListener(HistoryListener listener) { if (impl != null) { BaseListenerWrapper.WrapHistory.remove(impl.getHandlers(), listener); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy