text: /*
   * 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.
   */
  
  #import <CoreGraphics/CoreGraphics.h>
  #import <Foundation/Foundation.h>
  #import "WXDisplayLinkManager.h"
  
  @class WXBridgeMethod;
  @class WXSDKInstance;
  @class WXComponent;
  
  #ifdef __cplusplus
  extern "C" {
  #endif
      
  void WXPerformBlockOnComponentThread(void (^block)(void));
  void WXPerformBlockSyncOnComponentThread(void (^block)(void));
      
  #ifdef __cplusplus
  }
  #endif
  
  @interface WXComponentManager : NSObject <WXDisplayLinkClient>
  
  @property (nonatomic, readonly, weak) WXSDKInstance *weexInstance;
  @property (nonatomic, readonly, assign) BOOL isValid;
  
  /**
   * @abstract initialize with weex instance
   **/
  - (instancetype)initWithWeexInstance:(WXSDKInstance *)weexInstance;
  
  /**
   * @abstract return the component thread
   **/
  + (NSThread *)componentThread;
  
  /**
   * @abstract starting component tasks
   **/
  - (void)startComponentTasks;
  
  /**
   * @abstract tell the component manager that instance root view's frame has been changed
   **/
  - (void)rootViewFrameDidChange:(CGRect)frame;
  
  ///--------------------------------------
  /// @name Component Tree Building
  ///--------------------------------------
  
  /**
   * @abstract create root component
   **/
  - (void)createBody:(NSString*)ref
                type:(NSString*)type
              styles:(NSDictionary*)styles
          attributes:(NSDictionary*)attributes
              events:(NSArray*)events
        renderObject:(void*)renderObject;
  
  /**
   * @abstract add a component to its parent
   **/
  - (void)addComponent:(NSString*)ref
                  type:(NSString*)type
             parentRef:(NSString*)parentRef
                styles:(NSDictionary*)styles
            attributes:(NSDictionary*)attributes
                events:(NSArray*)events
                 index:(NSInteger)index
          renderObject:(void*)renderObject;
  
  /**
   * @abstract move component
   **/
  - (void)moveComponent:(NSString *)ref toSuper:(NSString *)superRef atIndex:(NSInteger)index;
  
  /**
   * @abstract remove component
   **/
  - (void)removeComponent:(NSString *)ref;
  
  /**
   * @abstract notify that a component tree is built and trigger layout,
      may be called several times rendering a page.
   **/
  - (void)appendTreeCreateFinish:(NSString*)ref;
  
  /**
   * @abstract return component for specific ref, must be called on component thread by calling WXPerformBlockOnComponentThread
   */
  - (WXComponent *)componentForRef:(NSString *)ref;
  
  /**
   * @abstract return root component
   */
  - (WXComponent *)componentForRoot;
  
  /**
   * @abstract number of components created, must be called on component thread by calling WXPerformBlockOnComponentThread
   */
  - (NSUInteger)numberOfComponents;
  
  /**
   * @abstract add an existing component to references look-up map
   */
  - (void)addComponent:(WXComponent *)component toIndexDictForRef:(NSString *)ref;
  
  ///--------------------------------------
  /// @name Updating
  ///--------------------------------------
  
  /**
   * @abstract update styles
   **/
  - (void)updateStyles:(NSDictionary *)styles forComponent:(NSString *)ref;
  
  /**
   * @abstract update pseudo class styles
   **/
  - (void)updatePseudoClassStyles:(NSDictionary *)styles forComponent:(NSString *)ref;
  
  /**
   * @abstract update attributes
   **/
  - (void)updateAttributes:(NSDictionary *)attributes forComponent:(NSString *)ref;
  
  /**
   * @abstract quick check that if a component has non transition properties
   **/
  - (BOOL)isTransitionNoneOfComponent:(NSString*)ref; // for quick access
  
  /**
   * @abstract check if component with @ref has any style in @styles which is animated
   **/
  - (BOOL)hasTransitionPropertyInStyles:(NSDictionary*)styles forComponent:(NSString*)ref;
  
  /**
   * @abstract layout a component with frame output by weex core layout engine
   **/
  - (void)layoutComponent:(WXComponent*)component frame:(CGRect)frame innerMainSize:(CGFloat)innerMainSize;
  
  /**
   * @abstract layout a component on platform side
   **/
  - (void)layoutComponent:(WXComponent*)component;
  
  /**
   * @abstract add event
   **/
  - (void)addEvent:(NSString *)event toComponent:(NSString *)ref;
  
  /**
   * @abstract remove event
   **/
  - (void)removeEvent:(NSString *)event fromComponent:(NSString *)ref;
  
  /**
   * @abstract scroll to specific component
   **/
  - (void)scrollToComponent:(NSString *)ref options:(NSDictionary *)options;
  
  ///--------------------------------------
  /// @name Life Cycle
  ///--------------------------------------
  
  /**
   * @abstract called when all doms are created
   **/
  - (void)createFinish;
  
  /**
   * @abstract called when all doms are refreshed
   **/
  - (void)refreshFinish;
  
  /**
   * @abstract called when all doms are updated
   **/
  - (void)updateFinish;
  
  /**
   * @abstract called when all doms are created and layout finished
   **/
  - (void)renderFinish;
  
  /**
   * @abstract called when render failed
   **/
  - (void)renderFailed:(NSError *)error;
  
  /**
   * @abstract unload
   **/
  - (void)unload;
  
  /**
   * @abstract invalidate component management, this can be called on main thread.
   **/
  - (void)invalidate;
  
  ///--------------------------------------
  /// @name Fixed
  ///--------------------------------------
  
  /**
   *  @abstract add a component which has a fixed position
   *
   *  @param fixComponent the fixed component to add
   */
  - (void)addFixedComponent:(WXComponent *)fixComponent;
  
  /**
   *  @abstract remove a component which has a fixed position
   *
   *  @param fixComponent the fixed component to remove
   */
  - (void)removeFixedComponent:(WXComponent *)fixComponent;
  
  /**
   * @abstract add a task to UI thread
   **/
  - (void)_addUITask:(void (^)(void))block;
  
  /**
   * @abstract execute a task to UI thread
   **/
  - (void)executePrerenderUITask:(NSString *)url;
  
  /**
   * @param styles a NSDictionary value, styles which will resolve
   * @param component a WXComponent value, the target which you want to resolve
   * @param isUpdateStyles a BOOL value, YES will udpate the component style property, NO will notifiy the lifeStyle of compoenent to handle, default value is NO.
   * @abstract handleStyle will be add to a queue to be executed every frame, but handleStyleOnMainThread will switch to main thread and execute imediately, you can call this for your execution time sequence.
   */
  - (void)handleStyleOnMainThread:(NSDictionary*)styles forComponent:(WXComponent *)component isUpdateStyles:(BOOL)isUpdateStyles;
  
  ///--------------------------------------
  /// @name Enumerating
  ///--------------------------------------
  
  /**
   * Enumerate components using breadth-first search algorithm,
   must be called on component thread by calling WXPerformBlockOnComponentThread
   */
  - (void)enumerateComponentsUsingBlock:(void (^)(WXComponent *, BOOL *stop))block;
  
  #pragma mark batch mark
  
  /**
   a start native batch tag for a group of UI operations, company with performBatchEnd
   @see performBatchEnd
   */
  - (void)performBatchBegin;
  
  /**
   an end native batch tag for a group of UI operations, company with performBatchBegin
   @see performBatchBegin
   */
  - (void)performBatchEnd;
  
  @end
  