//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You 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 mx.managers { import mx.core.Singleton; import mx.core.mx_internal; import mx.managers.IHistoryManagerClient; use namespace mx_internal; /** * History management lets users navigate through a Flex application * using the web browser's Back and Forward navigation commands. * *

In general, you should use the BrowserManager class and deep linking for maintaining state * in an application and manipulating URLs and browser history, but the HistoryManager class can * be useful under some circumstances, such as if you are maintaining a legacy Flex application. * You cannot use the HistoryManager and the BrowserManager classes in the same Flex application, * even though they use the same set of supporting files.

* *

History management is enabled by default for the Accordion and TabNavigator containers. * This means that if the user selects one of the panes in an Accordion control, * that user can return to the previous pane by using the browser's Back button or back * navigation command. History management is disabled by default for the ViewStack * navigator container.

* *

You can disable history management by setting the navigator container's * historyManagementEnabled property to false.

* *

You can also enable history management for other objects * in an application by registering the objects with the HistoryManager. To register a component * with the HistoryManager class, you call the HistoryManager class's register() * method with a reference to a component instance that implements the IHistoryManagerClient interface. * In the following example, the Application component (this) is registered with * the HistoryManager class when the Application is initialized: *

 *  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
 *    implements="mx.managers.IHistoryManagerClient" 
 *    initialize="mx.managers.HistoryManager.register(this);">
 *  
* You must also implement the saveState() and loadState() methods of the * IHistoryManagerClient interface to complete the registration of the component. Components that extend * UIComponent automatically inherit the loadState() method.

* *

All methods and properties of the HistoryManager are static, * so you do not need to create an instance of it.

* * @see mx.managers.BrowserManager * @see mx.managers.IHistoryManagerClient * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public class HistoryManager { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Class variables // //-------------------------------------------------------------------------- /** * @private * Linker dependency on implementation class. */ private static var implClassDependency:HistoryManagerImpl; /** * @private * Storage for the impl getter. * This gets initialized on first access, * not at static initialization time, in order to ensure * that the Singleton registry has already been initialized. */ private static var _impl:IHistoryManager; /** * @private * The singleton instance of HistoryManagerImpl which was * registered as implementing the IHistoryManager interface. */ private static function get impl():IHistoryManager { if (!_impl) { _impl = IHistoryManager( Singleton.getInstance("mx.managers::IHistoryManager")); } return _impl; } //-------------------------------------------------------------------------- // // Class methods // //-------------------------------------------------------------------------- /** * DEPRECATED - Initializes the HistoryManager. In general, this does not need to be called * because any time you add a component with historyManagementEnabled, Flex * calls this method. However, the HistoryManager will not work correctly if it is * not initialized from the top-level application. So, if your application does * not have any HistoryManager enabled components in it and loads other sub-applications * That do, you must call the HistoryManager.initialize() method in the * main application, usually from an initialize event handler on the application. * * @param sm SystemManager for this application. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public static function initialize(sm:ISystemManager):void { // this code is handled in HistoryManagerImpl.getInstance() now } /** * Registers an object with the HistoryManager. * The object must implement the IHistoryManagerClient interface. * * @param obj Object to register. * * @see mx.managers.IHistoryManagerClient * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public static function register(obj:IHistoryManagerClient):void { impl.register(obj); } /** * Unregisters an object with the HistoryManager. * * @param obj Object to unregister. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public static function unregister(obj:IHistoryManagerClient):void { impl.unregister(obj); } /** * Saves the application's current state so it can be restored later. * This method is automatically called by navigator containers * whenever their navigation state changes. * If you registered an interface with the HistoryManager, * you are responsible for calling the save() method * when the application state changes. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public static function save():void { impl.save(); } } }