//----------------------------------------------------------------------------
// ObjectWindows
// Copyright (c) 1995, 1996 by Borland International, All Rights Reserved
//
/// \file
/// Definition of helper classes for Pane Splitters
//----------------------------------------------------------------------------
 
#if !defined(OWL_SPLITTER_H)
#define OWL_SPLITTER_H
 
#include <owl/private/defs.h>
#if defined(BI_HAS_PRAGMA_ONCE)
# pragma once
#endif
 
#include <owl/layoutwi.h>
#include <owl/shddel.h>
#include <owl/template.h> //added by DLN
 
namespace owl {
 
class _OWLCLASS TDC;
 
/// \cond NoSuppressDoxygenWarning
#include <owl/preclass.h>
/// \endcond
 
//
/// Enumeration describing whether to split a window in the X or Y plane.
//
enum TSplitDirection {
  psHorizontal,               ///< Horizontal split
  psVertical,                 ///< Vertical split
  psNone                      ///< Unspecified split
};
 
class _OWLCLASS TSplitterIndicator;
class _OWLCLASS TPaneSplitter;
 
//
/// \class TSplitter
// ~~~~~ ~~~~~~~~~
/// Abstract base class for TVSplitter and THSplitter.
//
class _OWLCLASS TSplitter : public TLayoutWindow {
  public:
    TSplitter(TWindow* parent, TPaneSplitter* ps, float percent);
 
    int                         operator ==(const TSplitter& splitter) const;
    float                       GetPercent();
    void                        SetPercent(float p);
    virtual TRect               GetRect() = 0;
    TRect                       GetScreenRect();
    virtual TSplitDirection     SplitDirection() = 0;
    virtual TSplitterIndicator* CreateSplitterIndicator() = 0;
    virtual TWindow*            Pane1() = 0;
    virtual TWindow*            Pane2() = 0;
    virtual void                Split(TWindow* targetPane,
                                      TWindow* newPane,
                                      TSplitDirection sd,
                                      float percent) = 0;
    virtual TLayoutMetrics      Setup(TWindow* targetPane,
                                      TWindow* newPane,
                                      float percent) = 0;
    virtual void                AdjForResize(const TSize& sz) = 0;
    TLayoutWindow*              RemovePane(TWindow* pane,
                                           TShouldDelete::DeleteType dt =
                                             TShouldDelete::DefDelete);
    TRect                       GetMoveArea();
    virtual void                Move(int dist) = 0;
    virtual void                AdjSplitterWidth(int w) = 0;
 
  protected:
    void                        EvLButtonDown(uint modKeys, const TPoint& point);
    void                        EvLButtonUp(uint modKeys, const TPoint& point);
    void                        EvMouseMove(uint modKeys, const TPoint& point);
    bool                        EvSetCursor(HWND hwndCursor, uint codeHitTest, TMsgId mouseMsg);
    void                        EvSize(uint sizeType, const TSize& size);
    void Paint(TDC&, bool erase, TRect&) override;
 
    void                        SetupEpilog(TSplitter* s, TWindow* targetPane,
                                            TWindow* newPane,
                                            TLayoutMetrics& lmOfTargetPane,
                                            TLayoutMetrics& lmOfNewPane);
 
  protected_data:
    // Represents the percent 'pane1' is of splitter (.5, .25, etc.).
    //
    float          PercentOf;
    TPaneSplitter* PaneSplitter;
 
  DECLARE_RESPONSE_TABLE(TSplitter);
};
 
//
/// \class TVSplitter
// ~~~~~ ~~~~~~~~~~
/// Represents a vertical splitter.
//
class _OWLCLASS TVSplitter : public TSplitter {
  public:
    TVSplitter(TWindow* parent, TPaneSplitter* ps, float percent=50.0f);
 
    // Pane1 is left of splitter and pane2 is right.
    //
    TWindow*             Pane1();
    TWindow*             Pane2();
    void                 Split(TWindow* targetPane, TWindow* newPane,
                               TSplitDirection sd, float percent=50.0f);
    TLayoutMetrics       Setup(TWindow* targetPane, TWindow* newPane, float percent);
    TRect                GetRect();
    TSplitDirection      SplitDirection();
    TSplitterIndicator*  CreateSplitterIndicator();
    void                 AdjForResize(const TSize& sz);
    void                 Move(int dist);
    void                 AdjSplitterWidth(int w);
};
 
//
/// \class THSplitter
// ~~~~~ ~~~~~~~~~~
/// Represents a horizontal splitter.
//
class _OWLCLASS THSplitter : public TSplitter {
  public:
    THSplitter(TWindow* parent, TPaneSplitter* ps, float percent=50.0f);
 
    // Pane1 is above splitter and pane2 is below.
    //
    TWindow*             Pane1();
    TWindow*             Pane2();
    void                 Split(TWindow* targetPane, TWindow* newPane,
                               TSplitDirection sd, float percent=50.0f);
    TLayoutMetrics       Setup(TWindow* targetPane, TWindow* newPane, float percent);
    TRect                GetRect();
    TSplitDirection      SplitDirection();
    TSplitterIndicator*  CreateSplitterIndicator();
    void                 AdjForResize(const TSize& sz);
    void                 Move(int dist);
    void                 AdjSplitterWidth(int w);
};
 
//
/// \class TSplitterIndicator
// ~~~~~ ~~~~~~~~~~~~~~~~~~
/// Indicates to the user where the splitter will be moved to when dragging
/// completes. Abstract base class for TVSplitterIndicator and
/// THSplitterIndicator.
//
class _OWLCLASS TSplitterIndicator : public TRect {
  public:
    TSplitterIndicator(TSplitter* splitter, const TRect& rect, uint cushion=0);
    virtual ~TSplitterIndicator() {}
 
    bool              operator == (const TSplitterIndicator& si) const;
    // make happy STL
    bool              operator < (const TSplitterIndicator& si) const;
    virtual void      ConnectToRect(const TRect& rect) = 0;
    virtual void      Move(int dist) = 0;
    uint              GetDistMoved();
    void              Draw();
    void              Clear();
    virtual int       CalcDistMoved(const TPoint& start, const TPoint& cur) = 0;
    virtual bool      CouldContain(const TPoint& point) = 0;
    TSplitter*        GetSplitter();
    virtual TRect     CalcAreaOfSplitterMove() = 0;
    void              SetCushion(const uint cushion);
 
  protected:
    TSplitter*  Splitter;
    bool        Showing;
    uint        DistMoved;
    //
    // Minimum distance btwn separators.
    //
    uint        Cushion;
};
 
//
/// \class TVSplitterIndicator
// ~~~~~ ~~~~~~~~~~~~~~~~~~~
/// Vertical indicator.
//
class _OWLCLASS TVSplitterIndicator : public TSplitterIndicator {
  public:
    TVSplitterIndicator(TSplitter* splitter, const TRect& rect, uint cushion=0);
 
    // Override virtuals
    //
    void    ConnectToRect(const TRect& rect);
    void    Move(int dist);
    int     CalcDistMoved(const TPoint& start, const TPoint& cur);
    bool    CouldContain(const TPoint& point);
    TRect   CalcAreaOfSplitterMove();
};
 
//
/// \class THSplitterIndicator
// ~~~~~ ~~~~~~~~~~~~~~~~~~~
/// Horizontal indicator.
//
class _OWLCLASS THSplitterIndicator : public TSplitterIndicator {
  public:
    THSplitterIndicator(TSplitter* splitter, const TRect& rect, uint cushion=0);
 
    // Override virtuals
    //
    void    ConnectToRect(const TRect& rect);
    void    Move(int dist);
    int     CalcDistMoved(const TPoint& start, const TPoint& cur);
    bool    CouldContain(const TPoint& point);
    TRect   CalcAreaOfSplitterMove();
};
 
//
//DLN replaced by class decl below class TSplitterIndicatorList;
 
//------------------------------------------------------------------------------
/// \class TSplitterIndicatorList
// ~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
class TSplitterIndicatorList: public TBaseList<TSplitterIndicator*>{
  public:
    TSplitterIndicatorList(){;}
    uint  NSplitterIndicators() { return Size(); }
    TSplitterIndicator* FindIndicatorWithSplitter(TSplitter* splitter);
    void Flush(bool del);
};
typedef TSplitterIndicatorList::Iterator TSplitterIndicatorListIterator;
 
//
/// \class TSplitterIndicatorMgr
// ~~~~~ ~~~~~~~~~~~~~~~~~~~~~
/// Handles the moving of the indicators.
//
class _OWLCLASS TSplitterIndicatorMgr {
  public:
    TSplitterIndicatorMgr();
 
    void            StartMove(TSplitterIndicatorList& sil, const TPoint& point);
    void            EndMove();
    void            MoveIndicators(const TPoint& point);
 
  private:
    TSplitterIndicatorList*   SplitterIndicatorList;
    TPoint                    StartDragPoint;
 
    void            DrawIndicators();
    void            ClearIndicators();
};
 
/// \cond NoSuppressDoxygenWarning
#include <owl/posclass.h>
/// \endcond
 
 
//----------------------------------------------------------------------------
// Inline implementations
 
//
inline int TSplitter::operator ==(const TSplitter& splitter) const
{
  return this == &splitter;
}
 
//
inline float TSplitter::GetPercent()
{
  return PercentOf;
}
 
//
inline void TSplitter::SetPercent(float p)
{
  PercentOf = p;
}
 
//
/// Return the area the splitter can move in (bounding rectangle).
/// The rect is in client coordinates.
//
inline TRect TSplitter::GetMoveArea()
{
  return GetWindowRect();
}
 
//
/// Similar to above except rect is in screen coordinates.
//
inline TRect TSplitter::GetScreenRect()
{
  TRect  rect = GetRect();
  MapWindowPoints(0, (TPoint*)&rect, 2);  // map to screen
  return rect;
}
 
//
inline TSplitDirection TVSplitter::SplitDirection()
{
  return psVertical;
}
 
//
inline TSplitDirection
THSplitter::SplitDirection()
{
  return psHorizontal;
}
 
//
inline TSplitterIndicator::TSplitterIndicator(TSplitter* splitter, const TRect& rect, uint cushion)
:
  TRect(rect), Splitter(splitter), Showing(false), DistMoved(0), Cushion(cushion)
{
}
 
//
inline bool TSplitterIndicator::operator ==(const TSplitterIndicator& si) const
{
  return this == &si;
}
 
//
inline uint
TSplitterIndicator::GetDistMoved()
{
  return DistMoved;
}
 
//
/// Clear indicator from screen.
//
inline void
TSplitterIndicator::Clear()
{
  if (Showing) {
    Showing = false;
    Draw();
    Showing = false;
  }
}
 
//
/// Return splitter from which this indicator was created.
//
inline TSplitter*
TSplitterIndicator::GetSplitter()
{
  return Splitter;
}
 
//
/// Set cushion
//
inline void
TSplitterIndicator::SetCushion(const uint cushion)
{
   Cushion = cushion;
}
 
//
inline TVSplitterIndicator::TVSplitterIndicator(TSplitter* splitter, const TRect& rect, uint cushion)
:
  TSplitterIndicator(splitter, rect, cushion)
{
}
 
//
inline THSplitterIndicator::THSplitterIndicator(TSplitter* splitter, const TRect& rect, uint cushion)
:
  TSplitterIndicator(splitter, rect, cushion)
{
}
 
/*
inline uint TSplitterIndicatorList::NSplitterIndicators()
{
  return size();
}
inline void TSplitterIndicatorList::Flush(bool del){
  if(del){
    TSplitterIndicatorList::iterator i = begin();
    while(i != end())
      delete *i;
  }
  this->erase(begin(),end());
}
*/
//
inline TSplitterIndicatorMgr::TSplitterIndicatorMgr()
:
  SplitterIndicatorList(0)
{
}
 
} // OWL namespace
 
 
#endif // OWL_SPLITTER_H

V1027 Pointer to an object of the 'TRect' class is cast to unrelated 'TPoint' class.

V832 It's better to use '= default;' syntax instead of empty constructor body.