// emSplitter.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 emSplitter_h
#define emSplitter_h

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

//================================= emSplitter =================================

class emSplitter : public emBorder {


        // Class for a splitter panel. Such a panel can get two child panels
        // which are laid out automatically, either horizontally or vertically,
        // filling the whole content area. Between the two child panels is a
        // grip which can be dragged by the user, for making one of the panels
        // larger while the other gets smaller.

                ParentArg parent, const emString & name,
                const emString & caption=emString(),
                const emString & description=emString(),
                const emImage & icon=emImage(),
                bool vertical=false, double minPos=0.0, double maxPos=1.0,
                double pos=0.5
                // Constructor.
                // Arguments:
                //   parent      - Parent for this panel (emPanel or emView).
                //   name        - The name for this panel.
                //   caption     - The label's caption, or empty.
                //   description - The label's description, or empty.
                //   icon        - The label's icon, or empty.
                //   vertical    - See SetVertical.
                //   minPos      - See SetMinMaxPos.
                //   maxPos      - See SetMinMaxPos.
                //   pos         - See SetPos.

        virtual ~emSplitter();
                // Destructor.

        bool IsVertical() const;
        void SetVertical(bool vertical=true);
                // Whether the child panels are laid out left-right (false) or
                // on top of each other (true).

        double GetMinPos() const;
        double GetMaxPos() const;
        double GetPos() const;
        void SetMinMaxPos(double minPos, double maxPos);
        void SetPos(double pos);
                // Get/set minimum, maximum and current position of the grip.
                // The position ranges from 0.0 to 1.0 (0.0 = first child panel
                // collapsed, 1.0 = second child panel collapsed).

        const emSignal & GetPosSignal() const;
                // This signal is signaled after each change of the grip
                // position.


        virtual void Input(emInputEvent & event, const emInputState & state,
                           double mx, double my);
        virtual emCursor GetCursor() const;
        virtual void PaintContent(
                const emPainter & painter, double x, double y, double w,
                double h, emColor canvasColor
        ) const;
        virtual void LayoutChildren();


        void CalcGripRect(
                double contentX, double contentY, double contentW,
                double contentH, double * pX, double * pY, double * pW,
                double * pH
        ) const;

        bool Vertical;
        double MinPos;
        double MaxPos;
        double Pos;
        emSignal PosSignal;
        bool Pressed;
        double MousePosInGrip;
        bool MouseInGrip;

inline bool emSplitter::IsVertical() const
        return Vertical;

inline double emSplitter::GetMinPos() const
        return MinPos;

inline double emSplitter::GetMaxPos() const
        return MaxPos;

inline double emSplitter::GetPos() const
        return Pos;

inline const emSignal & emSplitter::GetPosSignal() const
        return PosSignal;