1202890513
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22722 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
250 lines
7.7 KiB
C++
250 lines
7.7 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: sashwin.h
|
|
// Purpose: wxSashWindow implementation. A sash window has an optional
|
|
// sash on each edge, allowing it to be dragged. An event
|
|
// is generated when the sash is released.
|
|
// Author: Julian Smart
|
|
// Modified by:
|
|
// Created: 01/02/97
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_SASHWIN_H_G_
|
|
#define _WX_SASHWIN_H_G_
|
|
|
|
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
|
|
#pragma interface "sashwin.h"
|
|
#endif
|
|
|
|
#if wxUSE_SASH
|
|
|
|
#include "wx/defs.h"
|
|
#include "wx/window.h"
|
|
#include "wx/string.h"
|
|
|
|
#define wxSASH_DRAG_NONE 0
|
|
#define wxSASH_DRAG_DRAGGING 1
|
|
#define wxSASH_DRAG_LEFT_DOWN 2
|
|
|
|
enum wxSashEdgePosition {
|
|
wxSASH_TOP = 0,
|
|
wxSASH_RIGHT,
|
|
wxSASH_BOTTOM,
|
|
wxSASH_LEFT,
|
|
wxSASH_NONE = 100
|
|
};
|
|
|
|
/*
|
|
* wxSashEdge represents one of the four edges of a window.
|
|
*/
|
|
|
|
class WXDLLIMPEXP_ADV wxSashEdge
|
|
{
|
|
public:
|
|
wxSashEdge() { m_show = FALSE; m_border = FALSE; m_margin = 0; }
|
|
|
|
bool m_show; // Is the sash showing?
|
|
bool m_border; // Do we draw a border?
|
|
int m_margin; // The margin size
|
|
};
|
|
|
|
/*
|
|
* wxSashWindow flags
|
|
*/
|
|
|
|
#define wxSW_NOBORDER 0x0000
|
|
//#define wxSW_3D 0x0010
|
|
#define wxSW_BORDER 0x0020
|
|
#define wxSW_3DSASH 0x0040
|
|
#define wxSW_3DBORDER 0x0080
|
|
#define wxSW_3D (wxSW_3DSASH | wxSW_3DBORDER)
|
|
|
|
/*
|
|
* wxSashWindow allows any of its edges to have a sash which can be dragged
|
|
* to resize the window. The actual content window will be created as a child
|
|
* of wxSashWindow.
|
|
*/
|
|
|
|
class WXDLLIMPEXP_ADV wxSashWindow: public wxWindow
|
|
{
|
|
public:
|
|
// Default constructor
|
|
wxSashWindow()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
// Normal constructor
|
|
wxSashWindow(wxWindow *parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow"))
|
|
{
|
|
Init();
|
|
Create(parent, id, pos, size, style, name);
|
|
}
|
|
|
|
~wxSashWindow();
|
|
|
|
bool Create(wxWindow *parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow"));
|
|
|
|
// Set whether there's a sash in this position
|
|
void SetSashVisible(wxSashEdgePosition edge, bool sash);
|
|
|
|
// Get whether there's a sash in this position
|
|
inline bool GetSashVisible(wxSashEdgePosition edge) const { return m_sashes[edge].m_show; }
|
|
|
|
// Set whether there's a border in this position
|
|
inline void SetSashBorder(wxSashEdgePosition edge, bool border) { m_sashes[edge].m_border = border; }
|
|
|
|
// Get whether there's a border in this position
|
|
inline bool HasBorder(wxSashEdgePosition edge) const { return m_sashes[edge].m_border; }
|
|
|
|
// Get border size
|
|
inline int GetEdgeMargin(wxSashEdgePosition edge) const { return m_sashes[edge].m_margin; }
|
|
|
|
// Sets the default sash border size
|
|
inline void SetDefaultBorderSize(int width) { m_borderSize = width; }
|
|
|
|
// Gets the default sash border size
|
|
inline int GetDefaultBorderSize() const { return m_borderSize; }
|
|
|
|
// Sets the addition border size between child and sash window
|
|
inline void SetExtraBorderSize(int width) { m_extraBorderSize = width; }
|
|
|
|
// Gets the addition border size between child and sash window
|
|
inline int GetExtraBorderSize() const { return m_extraBorderSize; }
|
|
|
|
virtual void SetMinimumSizeX(int min) { m_minimumPaneSizeX = min; }
|
|
virtual void SetMinimumSizeY(int min) { m_minimumPaneSizeY = min; }
|
|
virtual int GetMinimumSizeX() const { return m_minimumPaneSizeX; }
|
|
virtual int GetMinimumSizeY() const { return m_minimumPaneSizeY; }
|
|
|
|
virtual void SetMaximumSizeX(int max) { m_maximumPaneSizeX = max; }
|
|
virtual void SetMaximumSizeY(int max) { m_maximumPaneSizeY = max; }
|
|
virtual int GetMaximumSizeX() const { return m_maximumPaneSizeX; }
|
|
virtual int GetMaximumSizeY() const { return m_maximumPaneSizeY; }
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// Implementation
|
|
|
|
// Paints the border and sash
|
|
void OnPaint(wxPaintEvent& event);
|
|
|
|
// Handles mouse events
|
|
void OnMouseEvent(wxMouseEvent& ev);
|
|
|
|
// Adjusts the panes
|
|
void OnSize(wxSizeEvent& event);
|
|
|
|
#if defined(__WXMSW__) || defined(__WXMAC__)
|
|
// Handle cursor correctly
|
|
void OnSetCursor(wxSetCursorEvent& event);
|
|
#endif // wxMSW
|
|
|
|
// Draws borders
|
|
void DrawBorders(wxDC& dc);
|
|
|
|
// Draws the sashes
|
|
void DrawSash(wxSashEdgePosition edge, wxDC& dc);
|
|
|
|
// Draws the sashes
|
|
void DrawSashes(wxDC& dc);
|
|
|
|
// Draws the sash tracker (for whilst moving the sash)
|
|
void DrawSashTracker(wxSashEdgePosition edge, int x, int y);
|
|
|
|
// Tests for x, y over sash
|
|
wxSashEdgePosition SashHitTest(int x, int y, int tolerance = 2);
|
|
|
|
// Resizes subwindows
|
|
void SizeWindows();
|
|
|
|
// Initialize colours
|
|
void InitColours();
|
|
|
|
private:
|
|
void Init();
|
|
|
|
wxSashEdge m_sashes[4];
|
|
int m_dragMode;
|
|
wxSashEdgePosition m_draggingEdge;
|
|
int m_oldX;
|
|
int m_oldY;
|
|
int m_borderSize;
|
|
int m_extraBorderSize;
|
|
int m_firstX;
|
|
int m_firstY;
|
|
int m_minimumPaneSizeX;
|
|
int m_minimumPaneSizeY;
|
|
int m_maximumPaneSizeX;
|
|
int m_maximumPaneSizeY;
|
|
wxCursor* m_sashCursorWE;
|
|
wxCursor* m_sashCursorNS;
|
|
wxColour m_lightShadowColour;
|
|
wxColour m_mediumShadowColour;
|
|
wxColour m_darkShadowColour;
|
|
wxColour m_hilightColour;
|
|
wxColour m_faceColour;
|
|
bool m_mouseCaptured;
|
|
wxCursor* m_currentCursor;
|
|
|
|
private:
|
|
DECLARE_DYNAMIC_CLASS(wxSashWindow)
|
|
DECLARE_EVENT_TABLE()
|
|
DECLARE_NO_COPY_CLASS(wxSashWindow)
|
|
};
|
|
|
|
BEGIN_DECLARE_EVENT_TYPES()
|
|
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,
|
|
wxEVT_SASH_DRAGGED, wxEVT_FIRST + 1200)
|
|
END_DECLARE_EVENT_TYPES()
|
|
|
|
// #define wxEVT_SASH_DRAGGED (wxEVT_FIRST + 1200)
|
|
|
|
enum wxSashDragStatus
|
|
{
|
|
wxSASH_STATUS_OK,
|
|
wxSASH_STATUS_OUT_OF_RANGE
|
|
};
|
|
|
|
class WXDLLIMPEXP_ADV wxSashEvent: public wxCommandEvent
|
|
{
|
|
public:
|
|
inline wxSashEvent(int id = 0, wxSashEdgePosition edge = wxSASH_NONE) {
|
|
m_eventType = (wxEventType) wxEVT_SASH_DRAGGED; m_id = id; m_edge = edge; }
|
|
|
|
inline void SetEdge(wxSashEdgePosition edge) { m_edge = edge; }
|
|
inline wxSashEdgePosition GetEdge() const { return m_edge; }
|
|
|
|
//// The rectangle formed by the drag operation
|
|
inline void SetDragRect(const wxRect& rect) { m_dragRect = rect; }
|
|
inline wxRect GetDragRect() const { return m_dragRect; }
|
|
|
|
//// Whether the drag caused the rectangle to be reversed (e.g.
|
|
//// dragging the top below the bottom)
|
|
inline void SetDragStatus(wxSashDragStatus status) { m_dragStatus = status; }
|
|
inline wxSashDragStatus GetDragStatus() const { return m_dragStatus; }
|
|
|
|
private:
|
|
wxSashEdgePosition m_edge;
|
|
wxRect m_dragRect;
|
|
wxSashDragStatus m_dragStatus;
|
|
|
|
private:
|
|
DECLARE_DYNAMIC_CLASS_NO_COPY(wxSashEvent)
|
|
};
|
|
|
|
typedef void (wxEvtHandler::*wxSashEventFunction)(wxSashEvent&);
|
|
|
|
#define EVT_SASH_DRAGGED(id, fn) \
|
|
DECLARE_EVENT_TABLE_ENTRY( wxEVT_SASH_DRAGGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSashEventFunction) & fn, NULL ),
|
|
#define EVT_SASH_DRAGGED_RANGE(id1, id2, fn) \
|
|
DECLARE_EVENT_TABLE_ENTRY( wxEVT_SASH_DRAGGED, id1, id2, (wxObjectEventFunction) (wxEventFunction) (wxSashEventFunction) & fn, NULL ),
|
|
|
|
#endif // wxUSE_SASH
|
|
|
|
#endif
|
|
// _WX_SASHWIN_H_G_
|