/**
 * Created by rburson on 3/18/16.
 */
import * as React from 'react';
import { CvState, CvProps, CvContext, CvEvent, CvNavigationResult, CvActionFiredResult, CvStateChangeResult } from './../core/catreact-core';
import { PaneContext, ListContext, DetailsContext, FormContext, MapContext, GraphContext, CalendarContext, ImagePickerContext, GeoFixContext, GeoLocationContext, BarcodeScanContext } from 'catavolt-sdk';
import ReactElement = React.ReactElement;
export interface CvFormPanelState extends CvState {
}
export interface CvFormPanelProps extends CvProps {
    /**
     * The sdk {FormContext} to use for this form panel. If not provided, the
     * {@link CvScopeContext} will be upwardly traversed to attempt to find a matching instance.
     */
    formContext?: FormContext;
    /**
     * Register to receive {@link CvEvent}s of type {@link CvNavigationResult}
     */
    navigationListeners?: Array<(event: CvEvent<CvNavigationResult>) => void>;
    /**
     * Register to receive {@link CvEvent}s of type {@link CvActionFiredResult}
     */
    actionListeners?: Array<(event: CvEvent<CvActionFiredResult>) => void>;
    /**
     * Provide a target for any navigations that originate from this component.  The navTarget should
     * correspond to the 'targetId' value of the coresident {@link CvNavigation} or {@link CvNavigator}.
     * This is useful for single page apps where components may be coresident.
     */
    navTarget?: string;
    /**
     * Register to receive {@link CvEvent}s of type {@link CvStateChangeResult}
     */
    stateChangeListeners?: Array<(event: CvEvent<CvStateChangeResult>) => void>;
    /**
     * A FormLayout component to use instead of the one supplied by the server meta data
     */
    layoutOverrideElem?: any;
    /**
     * Provide a custom renderer for the entire form.  See {@link CvFormComponentProvider}
     */
    formComponentProvider?: CvFormComponentProvider;
}
/**
 * Allows for overriding some or all of the construction of a {@link CvFormPanel}.
 * An object may be provided to the {@link CvFormPanel} that implements any or all of the methods on this interface.
 * The form rendering process will use any of the implemented methods on the provided object, and fallback on the defaults for others.
 */
export interface CvFormComponentProvider {
    getFormRenderer?(): (cvContext: CvContext, childComponents: Array<ReactElement<any>>) => ReactElement<any>;
    getChildFormComponentRenderer?(): (formContext: FormContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getDetailsComponentRenderer?(): (detailsContext: DetailsContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getGraphComponentRenderer?(): (graphContext: GraphContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getListComponentRenderer?(): (listContext: ListContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getMapComponentRenderer?(): (mapContext: MapContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getCalendarComponentRenderer?(): (calendarContext: CalendarContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getImagePickerComponentRenderer?(): (imagePickerContext: ImagePickerContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getGeoFixComponentRenderer?(): (geoFixContext: GeoFixContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getGeoLocationComponentRenderer?(): (geoLocationContext: GeoLocationContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
    getBarcodeScanComponentRenderer?(): (barcodeScanContext: BarcodeScanContext, stateChangeListener: (event: CvEvent<CvStateChangeResult>) => void) => {};
}
/**
 * Renders a FormContext, utilizing a series of composite, component renderers
 * These may be overriden via {@link CvFormComponentProvider}
 */
export declare var CvFormPanel: React.ClassicComponentClass<CvFormPanelProps>;
export interface CvFormItemPanelProps extends CvProps {
    displayElement: ReactElement<any>;
    menuElement: ReactElement<any>;
    paneContext: PaneContext;
}
export declare var CvFormItemPanel: React.ClassicComponentClass<CvFormItemPanelProps>;
export interface CvFormLayoutState extends CvState {
}
export interface CvFormLayoutProps extends CvProps {
    formComponents: Array<ReactElement<any>>;
    formContext: FormContext;
    navigationListeners?: Array<(event: CvEvent<CvNavigationResult>) => void>;
    actionListeners?: Array<(event: CvEvent<CvActionFiredResult>) => void>;
    navTarget?: string;
}
export declare var CvFormLayout: {
    formComponents: () => ReactElement<any>[];
    formContext: () => FormContext;
};
/**
 *  Tabbed Form Layout
 */
export interface CvTabbedFormMenuProps extends CvFormLayoutProps {
    tabSelectionListener: (selectedItem: number) => void;
}
export declare var CvTabbedFormMenu: React.ClassicComponentClass<CvTabbedFormMenuProps>;
export interface CvTabbedFormPanelState extends CvFormLayoutState {
    activeItem: number;
}
export declare var CvTabbedFormPanel: React.ClassicComponentClass<CvFormLayoutProps>;
export declare var CvFormOptionsLayoutPane: React.ClassicComponentClass<CvFormLayoutProps>;
export declare var CvFormRightSplitPane: React.ClassicComponentClass<CvFormLayoutProps>;
export declare var CvFormLeftSplitPane: React.ClassicComponentClass<CvFormLayoutProps>;
export declare var CvFormBottomSplitPane: React.ClassicComponentClass<CvFormLayoutProps>;
export declare var CvFormTopSplitPane: React.ClassicComponentClass<CvFormLayoutProps>;
export declare var CvFormFourBoxSplitPane: React.ClassicComponentClass<CvFormLayoutProps>;
export declare var CvVerticalLayoutFormPane: React.ClassicComponentClass<CvFormLayoutProps>;
