    //------------------------------------------------------------------------------
    // emTunnel.h
    //
    // Copyright (C) 2005-2010,2014,2016 Oliver Hamann.
    //
    // Homepage: http://eaglemode.sourceforge.net/
    //
    // This program is free software: you can redistribute it and/or modify it under
    // the terms of the GNU General Public License version 3 as published by the
    // Free Software Foundation.
    //
    // This program is distributed in the hope that it will be useful, but WITHOUT
    // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    // FOR A PARTICULAR PURPOSE. See the GNU General Public License version 3 for
    // more details.
    //
    // You should have received a copy of the GNU General Public License version 3
    // along with this program. If not, see <http://www.gnu.org/licenses/>.
    //------------------------------------------------------------------------------

    #ifndef emTunnel_h
    #define emTunnel_h

    #ifndef emBorder_h
    #include <emCore/emBorder.h>
    #endif

    //==============================================================================
    //================================== emTunnel ==================================
    //==============================================================================

    class emTunnel : public emBorder {

    public:

            // This panel shows a single child panel very small. Around that, a
            // decoration is painted which looks like a tunnel. Therefore the name
            // of this class. The single child panel is laid out automatically
            // whenever it is created by the user of this class.

            emTunnel(
                    ParentArg parent, const emString & name,
                    const emString & caption=emString(),
                    const emString & description=emString(),
                    const emImage & icon=emImage()
            );
                    // Constructor.

            double GetChildTallness() const;
            void SetChildTallness(double childTallness);
                    // Tallness for the child panel (end of tunnel). A value <=0.0
                    // means to take the tallness of the content rectangle. That is
                    // the default.

            double GetDepth() const;
            void SetDepth(double depth);
                    // Depth of the tunnel. The formula is more or less:
                    //   AreaOfEnd = AreaOfEntrance/((Depth+1)*(Depth+1))
                    // The default is 10.0.

            virtual void GetChildRect(
                    double * pX, double * pY, double * pW, double * pH,
                    emColor * pCanvasColor=NULL
            ) const;
                    // Get coordinates and canvas color of the end of the tunnel.

            // - - - - - - - - - - Depreciated methods - - - - - - - - - - - - - - -
            // The following virtual non-const methods have been replaced by const
            // methods (see above). The old versions still exist here with the
            // "final" keyword added, so that old overridings will fail to compile.
            // If you run into this, please adapt your overridings by adding "const".
            virtual void GetChildRect(
                    double * pX, double * pY, double * pW, double * pH,
                    emColor * pCanvasColor=NULL
            ) final;
            // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    protected:

            virtual void PaintContent(
                    const emPainter & painter, double x, double y, double w,
                    double h, emColor canvasColor
            ) const;

            virtual void LayoutChildren();

    private:

            enum DoTunnelFunc {
                    TUNNEL_FUNC_PAINT,
                    TUNNEL_FUNC_CHILD_RECT
            };
            void DoTunnel(
                    DoTunnelFunc func, const emPainter * painter,
                    emColor canvasColor, double * pX, double * pY, double * pW,
                    double * pH, emColor * pCanvasColor
            ) const;

            double ChildTallness,Depth;
    };

    inline double emTunnel::GetChildTallness() const
    {
            return ChildTallness;
    }

    inline double emTunnel::GetDepth() const
    {
            return Depth;
    }

    #endif