/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#ifndef __FRAMEWORK_CLASSES_FRAMELISTANALYZER_HXX_
#define __FRAMEWORK_CLASSES_FRAMELISTANALYZER_HXX_

//_______________________________________________
//	interface includes
#include <com/sun/star/frame/XFrame.hpp>

//_______________________________________________
//	other includes
#include <framework/fwedllapi.h>

//_______________________________________________
//	namespace

namespace framework{

//_______________________________________________
//	exported const

//_______________________________________________
//	exported definitions

/** analyze and split the current available frame list of a given frames supplier
    into different parts.

    These analyzed informations can be used e.g. to decide if it's neccessary
    to switch into the backing mode, close the current active frame only or
    exit the whole application explicitly or implicitly.
 */
class FWE_DLLPUBLIC FrameListAnalyzer
{
    //_______________________________________
    // types

    public:

        /** These enums can be combined as flags to enable/disable
            special search algorithm during analyze phase.
            see impl_analyze() for further informations.
            But note: To be useable as flags, these enums
            must be values of range [2^n]! */
        enum EDetect
        {
            E_MODEL             =     1,
            E_HELP              =     2,
            E_BACKINGCOMPONENT  =     4,
            E_HIDDEN            =     8,
            E_ALL               =    15,
            E_ZOMBIE            = 32768 // use it for special test scenarios only!!!
        };

    //_______________________________________
    // member

    public:

        /** provides access to the frame container, which should be analyzed. */
        const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFramesSupplier >& m_xSupplier;

        /** hold the reference frame, which is used e.g. to detect other frames with the same model. */
        const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& m_xReferenceFrame;

        /** enable/disable some special analyzing steps.
            see impl_analyze() for further informations. */
        sal_uInt32 m_eDetectMode;

        /** contains all frames, which uses the same model like the reference frame.
            Will be filled only if m_eDetectMode has set the flag E_MODEL.
            The reference frame is never part of this list! */
        ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > > m_lModelFrames;

        /** contains all frames, which does not contain the same model like the reference frame.
            Filling of it can't be supressed by m_eDetectMode.
            The reference frame is never part of this list!
            All frames inside this list are visible ones. */
        ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > > m_lOtherVisibleFrames;

        /** contains all frames, which does not contain the same model like the reference frame.
            Filling of it can't be supressed by m_eDetectMode.
            The reference frame is never part of this list!
            All frames inside this list are hidden ones. */
        ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > > m_lOtherHiddenFrames;

        /** points to the help frame.
            Will be set only, if any other frame (means different from the reference frame)
            contains the help component. If the reference frame itself includes the help module
            it's not set ... but another member m_bIsHelp is used to safe this information.
            See following example code:

            <listing>
            if (m_xReferenceFrame == help)
            {
                m_xHelp   = NULL;
                m_bIsHelp = sal_True;
            }
            else
            if (xOtherFrame == help)
            {
                m_xHelp   = xOtherFrame;
                m_bIsHelp = sal_False;
            }
            </listing>

            Analyzing of the help frame ignores the visible state of any frame.
            But note: a hidden help frame indicates a wrong state!
         */
        ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > m_xHelp;

        /** points to the frame, which contains the backing component.
            Will be set only, if any other frame (means different from the reference frame)
            contains the backing component. If the reference frame itself includes the
            backing component it's not set ... but another member m_bIsBackingComponent
            will used to safe this information.
            See following example code:

            <listing>
            if (m_xReferenceFrame == backing)
            {
                m_xBackingComponent   = NULL;
                m_bIsBackingComponent = sal_True;
            }
            else
            if (xOtherFrame == backing)
            {
                m_xBackingComponent   = xOtherFrame;
                m_bIsBackingComponent = sal_False      ;
            }
            </listing>

            Analyzing of the help frame ignores the visible state of any frame.
            But note: a hidden backing mode frame indicates a wrong state!
         */
        ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > m_xBackingComponent;

        /** is set to true only, if the reference frame is a hidden one.
            This value is undefined if m_eDetectMode doesn't have set the flag E_HIDDEN! */
        sal_Bool m_bReferenceIsHidden;

        /** is set to true only, if the reference frame contains the help component.
            In this case the member m_xHelp is set to NULL everytimes.
            This value is undefined if m_eDetectMode doesn't have set the flag E_HELP! */
        sal_Bool m_bReferenceIsHelp;

        /** is set to true only, if the reference frame contains the backing component.
            In this case the member m_xBackingComponent is set to NULL everytimes.
            This value is undefined if m_eDetectMode doesn't have set the flag E_BACKINGCOMPONENT! */
        sal_Bool m_bReferenceIsBacking;

    //_______________________________________
    // interface

	public:

        /** starts analyze phase and fille all members with valid informations.

            @param xSupplier
                    Must be a valid reference to a frames supplier, which provies
                    access to the frame list for analyzing.

            @param xReferenceFrame
                    This frame must(!) exist inside the analyzed frame list and
                    is used for some comparing functions. Further some member states
                    depends from the current state of this frame.

            @param eDetectMode
                    It represent a flag field, which can enable/disable special
                    analyze steps. Note: Some member values will be undefined, if
                    an analyze step will be disabled.
         */
                 FrameListAnalyzer( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFramesSupplier >& xSupplier       ,
                                    const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >&          xReferenceFrame ,
                                          sal_uInt32                                          eDetectMode     );
        virtual ~FrameListAnalyzer();

    //_______________________________________
    // helper

    private:

            void impl_analyze();


}; // class FrameListAnalyzer

} // namespace framework

#endif // #ifndef __FRAMEWORK_CLASSES_FRAMELISTANALYZER_HXX_
