From b3208e1158e3bbc38b73eeda606d92be9e649c1c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 21 Jul 2003 23:12:17 +0000 Subject: [PATCH] virtualized splitter drawing; removed/deprecated some styles and moved others from wx/defs.h; eliminated flicker git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22218 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/defs.h | 14 -- include/wx/generic/splitter.h | 26 +-- include/wx/renderer.h | 36 ++++ include/wx/splitter.h | 17 ++ src/generic/renderg.cpp | 139 ++++++++++++- src/generic/splitter.cpp | 373 +++++++--------------------------- src/mac/carbon/renderer.cpp | 23 +++ src/mac/renderer.cpp | 23 +++ 8 files changed, 309 insertions(+), 342 deletions(-) diff --git a/include/wx/defs.h b/include/wx/defs.h index 1071874f0e..0796f7ffcf 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -1237,20 +1237,6 @@ enum wxBorder #define wxSP_ARROW_KEYS 0x1000 #define wxSP_WRAP 0x2000 -/* - * wxSplitterWindow flags - */ -#define wxSP_NOBORDER 0x0000 -#define wxSP_NOSASH 0x0010 -#define wxSP_BORDER 0x0020 -#define wxSP_PERMIT_UNSPLIT 0x0040 -#define wxSP_LIVE_UPDATE 0x0080 -#define wxSP_3DSASH 0x0100 -#define wxSP_3DBORDER 0x0200 -#define wxSP_FULLSASH 0x0400 -#define wxSP_3D (wxSP_3DBORDER | wxSP_3DSASH) -#define wxSP_SASH_AQUA 0x0800 - /* * wxNotebook flags */ diff --git a/include/wx/generic/splitter.h b/include/wx/generic/splitter.h index e94f7a9068..699b9bee8a 100644 --- a/include/wx/generic/splitter.h +++ b/include/wx/generic/splitter.h @@ -133,16 +133,16 @@ public: bool IsSplit() const { return (m_windowTwo != NULL); } // Sets the sash size - void SetSashSize(int width) { m_sashSize = width; } + void SetSashSize(int WXUNUSED(width)) { } // Sets the border size - void SetBorderSize(int width) { m_borderSize = width; } + void SetBorderSize(int WXUNUSED(width)) { } // Gets the sash size - int GetSashSize() const { return m_sashSize; } + int GetSashSize() const; // Gets the border size - int GetBorderSize() const { return m_borderSize; } + int GetBorderSize() const; // Set the sash position void SetSashPosition(int position, bool redraw = TRUE); @@ -192,9 +192,6 @@ public: // In live mode, resize child windows in idle time void OnInternalIdle(); - // Draws borders - virtual void DrawBorders(wxDC& dc); - // Draws the sash virtual void DrawSash(wxDC& dc); @@ -202,14 +199,11 @@ public: virtual void DrawSashTracker(int x, int y); // Tests for x, y over sash - virtual bool SashHitTest(int x, int y, int tolerance = 2); + virtual bool SashHitTest(int x, int y, int tolerance = 5); // Resizes subwindows virtual void SizeWindows(); - // Initialize colours - void InitColours(); - void SetNeedUpdating(bool needUpdating) { m_needUpdating = needUpdating; } bool GetNeedUpdating() const { return m_needUpdating ; } @@ -262,8 +256,6 @@ protected: int m_dragMode; int m_oldX; int m_oldY; - int m_borderSize; - int m_sashSize; // Sash width or height int m_sashPosition; // Number of pixels from left or top int m_requestedSashPosition; int m_sashPositionCurrent; // while dragging @@ -272,13 +264,7 @@ protected: int m_minimumPaneSize; wxCursor m_sashCursorWE; wxCursor m_sashCursorNS; - wxPen* m_sashTrackerPen; - wxPen* m_lightShadowPen; - wxPen* m_mediumShadowPen; - wxPen* m_darkShadowPen; - wxPen* m_hilightPen; - wxBrush* m_faceBrush; - wxPen* m_facePen; + wxPen *m_sashTrackerPen; private: WX_DECLARE_CONTROL_CONTAINER(); diff --git a/include/wx/renderer.h b/include/wx/renderer.h index 325250d6ee..20c06d29ad 100644 --- a/include/wx/renderer.h +++ b/include/wx/renderer.h @@ -76,6 +76,26 @@ public: const wxRect& rect, int flags = 0) = 0; + // draw the border for sash window: this border must be such that the sash + // drawn by DrawSash() blends into it well + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect) = 0; + + // draw a (vertical) sash + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position) = 0; + + + // geometry functions + // ------------------ + + // get the splitter parameters: the x field of the returned point is the + // sash width and the y field is the border width + virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win) = 0; + // pseudo constructors // ------------------- @@ -106,12 +126,28 @@ public: const wxRect& rect, int flags = 0) { m_rendererNative.DrawHeaderButton(win, dc, rect, flags); } + virtual void DrawTreeItemButton(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0) { m_rendererNative.DrawTreeItemButton(win, dc, rect, flags); } + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect) + { m_rendererNative.DrawSplitterBorder(win, dc, rect); } + + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position) + { m_rendererNative.DrawSplitterSash(win, dc, size, position); } + + + virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win) + { return m_rendererNative.GetSplitterSashAndBorder(win); } + protected: wxRendererNative& m_rendererNative; }; diff --git a/include/wx/splitter.h b/include/wx/splitter.h index 1d55c78821..82a2b79878 100644 --- a/include/wx/splitter.h +++ b/include/wx/splitter.h @@ -3,6 +3,23 @@ #include "wx/event.h" +// ---------------------------------------------------------------------------- +// wxSplitterWindow flags +// ---------------------------------------------------------------------------- + +#define wxSP_NOSASH 0x0010 +#define wxSP_PERMIT_UNSPLIT 0x0040 +#define wxSP_LIVE_UPDATE 0x0080 + +// obsolete styles, don't do anything +#define wxSP_BORDER 0 +#define wxSP_NOBORDER 0 +#define wxSP_SASH_AQUA 0 +#define wxSP_3DSASH 0 +#define wxSP_3DBORDER 0 +#define wxSP_FULLSASH 0 +#define wxSP_3D (wxSP_3DBORDER | wxSP_3DSASH) + BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, 850) DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, 851) diff --git a/src/generic/renderg.cpp b/src/generic/renderg.cpp index 08ecf8fba3..19a4777f64 100644 --- a/src/generic/renderg.cpp +++ b/src/generic/renderg.cpp @@ -42,21 +42,46 @@ class WXDLLEXPORT wxRendererGeneric : public wxRendererNative { public: - // draw the header control button (used by wxListCtrl) + wxRendererGeneric(); + virtual void DrawHeaderButton(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0); - // draw the expanded/collapsed icon for a tree control item virtual void DrawTreeItemButton(wxWindow *win, wxDC& dc, const wxRect& rect, int flags = 0); + + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect); + + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position); + + + virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win); + + +protected: + // draw the rectange using the first pen for the left and top sides and + // the second one for the bottom and right ones + void DrawShadedRect(wxDC& dc, wxRect *rect, + const wxPen& pen1, const wxPen& pen2); + + // the standard pens + wxPen m_penBlack, + m_penDarkGrey, + m_penLightGrey, + m_penHighlight; }; // ============================================================================ -// implementation +// wxRendererGeneric implementation // ============================================================================ // ---------------------------------------------------------------------------- @@ -82,8 +107,42 @@ wxRendererNative& wxRendererNative::Get() #endif // platforms using their own renderers +wxRendererGeneric::wxRendererGeneric() + : m_penBlack(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW)), + m_penDarkGrey(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)), + m_penLightGrey(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)), + m_penHighlight(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT)) +{ +} + // ---------------------------------------------------------------------------- -// wxRendererGeneric drawing functions +// wxRendererGeneric helpers +// ---------------------------------------------------------------------------- + +void +wxRendererGeneric::DrawShadedRect(wxDC& dc, + wxRect *rect, + const wxPen& pen1, + const wxPen& pen2) +{ + // draw the rectangle + dc.SetPen(pen1); + dc.DrawLine(rect->GetLeft(), rect->GetTop(), + rect->GetLeft(), rect->GetBottom()); + dc.DrawLine(rect->GetLeft() + 1, rect->GetTop(), + rect->GetRight(), rect->GetTop()); + dc.SetPen(pen2); + dc.DrawLine(rect->GetRight(), rect->GetTop(), + rect->GetRight(), rect->GetBottom()); + dc.DrawLine(rect->GetLeft(), rect->GetBottom(), + rect->GetRight() + 1, rect->GetBottom()); + + // adjust the rect + rect->Inflate(-1); +} + +// ---------------------------------------------------------------------------- +// tree/list ctrl drawing // ---------------------------------------------------------------------------- void @@ -99,19 +158,17 @@ wxRendererGeneric::DrawHeaderButton(wxWindow *win, w = rect.width, h = rect.height; - dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.SetPen( *wxBLACK_PEN ); + dc.SetPen(m_penBlack); dc.DrawLine( x+w-CORNER+1, y, x+w, y+h ); // right (outer) dc.DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer) - wxPen pen( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNSHADOW ), 1, wxSOLID ); - - dc.SetPen( pen ); + dc.SetPen(m_penDarkGrey); dc.DrawLine( x+w-CORNER, y, x+w-1, y+h ); // right (inner) dc.DrawRectangle( x+1, y+h-1, w-2, 1 ); // bottom (inner) - dc.SetPen( *wxWHITE_PEN ); + dc.SetPen(m_penHighlight); dc.DrawRectangle( x, y, w-CORNER+1, 1 ); // top (outer) dc.DrawRectangle( x, y, 1, h ); // left (outer) dc.DrawLine( x, y+h-1, x+1, y+h-1 ); @@ -143,4 +200,66 @@ wxRendererGeneric::DrawTreeItemButton(wxWindow *win, } } +// ---------------------------------------------------------------------------- +// sash drawing +// ---------------------------------------------------------------------------- + +wxPoint +wxRendererGeneric::GetSplitterSashAndBorder(const wxWindow * WXUNUSED(win)) +{ + // see below + return wxPoint(7, 2); +} + +void +wxRendererGeneric::DrawSplitterBorder(wxWindow * WXUNUSED(win), + wxDC& dc, + const wxRect& rectOrig) +{ + wxRect rect = rectOrig; + DrawShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); + DrawShadedRect(dc, &rect, m_penBlack, m_penLightGrey); +} + +void +wxRendererGeneric::DrawSplitterSash(wxWindow * WXUNUSED(win), + wxDC& dc, + const wxSize& size, + wxCoord position) +{ + // we draw a Win32-like sash here: + // + // ---- this is position + // / + // v + // dWGGGDd + // GWGGGDB + // GWGGGDB where G is light grey (face) + // GWGGGDB W white (light) + // GWGGGDB D dark grey (shadow) + // GWGGGDB B black (dark shadow) + // GWGGGDB + // GWGGGDB and lower letters are our border (already drawn) + // GWGGGDB + // wWGGGDd + + const wxCoord h = size.y; + + // from left to right + dc.SetPen(m_penLightGrey); + dc.DrawLine(position, 1, position, h - 1); + + dc.SetPen(m_penHighlight); + dc.DrawLine(position + 1, 0, position + 1, h); + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE))); + dc.DrawRectangle(position + 2, 0, 3, h); + + dc.SetPen(m_penDarkGrey); + dc.DrawLine(position + 5, 0, position + 5, h); + + dc.SetPen(m_penBlack); + dc.DrawLine(position + 6, 1, position + 6, h - 1); +} diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 6c5965e49a..588657f137 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -17,6 +17,7 @@ #include "wx/wxprec.h" #if wxUSE_SPLITTER + #ifdef __BORLANDC__ #pragma hdrstop #endif @@ -35,6 +36,9 @@ #include "wx/settings.h" #endif +#include "wx/dcmirror.h" +#include "wx/renderer.h" + #include "wx/splitter.h" #include @@ -70,29 +74,18 @@ bool wxSplitterWindow::Create(wxWindow *parent, wxWindowID id, // allow TABbing from one window to the other style |= wxTAB_TRAVERSAL; - if (!wxWindow::Create(parent, id, pos, size, style, name)) - return FALSE; - - m_permitUnsplitAlways = (style & wxSP_PERMIT_UNSPLIT) != 0; + // we draw our border ourselves to blend the sash with it + style &= ~wxBORDER_MASK; + style |= wxBORDER_NONE; - if ( style & wxSP_3DSASH ) - m_sashSize = 7; - else - m_sashSize = 3; + // we don't need to be completely repainted after resize and doing it + // results in horrible flicker + style |= wxNO_FULL_REPAINT_ON_RESIZE; - if ( style & wxSP_3DBORDER ) - m_borderSize = 2; - else if ( style & wxSP_BORDER ) - m_borderSize = 1; - else - m_borderSize = 0; + if ( !wxWindow::Create(parent, id, pos, size, style, name) ) + return FALSE; -#ifdef __WXMAC__ - int major,minor; - wxGetOsVersion( &major, &minor ); - if (major >= 10) - m_windowStyle |= wxSP_SASH_AQUA; -#endif + m_permitUnsplitAlways = (style & wxSP_PERMIT_UNSPLIT) != 0; return TRUE; } @@ -110,21 +103,11 @@ void wxSplitterWindow::Init() m_oldY = 0; m_firstX = 0; m_firstY = 0; - m_sashSize = 3; - m_borderSize = 0; m_sashPosition = m_requestedSashPosition = 0; m_minimumPaneSize = 0; m_sashCursorWE = wxCursor(wxCURSOR_SIZEWE); m_sashCursorNS = wxCursor(wxCURSOR_SIZENS); m_sashTrackerPen = new wxPen(*wxBLACK, 2, wxSOLID); - m_lightShadowPen = (wxPen *) NULL; - m_mediumShadowPen = (wxPen *) NULL; - m_darkShadowPen = (wxPen *) NULL; - m_faceBrush = (wxBrush *) NULL; - m_facePen = (wxPen *) NULL; - m_hilightPen = (wxPen *) NULL; - - InitColours(); m_needUpdating = FALSE; } @@ -132,12 +115,6 @@ void wxSplitterWindow::Init() wxSplitterWindow::~wxSplitterWindow() { delete m_sashTrackerPen; - delete m_lightShadowPen; - delete m_darkShadowPen; - delete m_mediumShadowPen; - delete m_hilightPen; - delete m_facePen; - delete m_faceBrush; } void wxSplitterWindow::SetResizeCursor() @@ -150,8 +127,6 @@ void wxSplitterWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); - if ( m_borderSize > 0 ) - DrawBorders(dc); DrawSash(dc); } @@ -168,10 +143,6 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) int x = (int)event.GetX(), y = (int)event.GetY(); -#if defined(__WXMSW__) - // SetCursor(wxCursor()); // Is this required? -#endif - if (GetWindowStyle() & wxSP_NOSASH) return; @@ -372,24 +343,17 @@ void wxSplitterWindow::OnSize(wxSizeEvent& event) bool iconized = FALSE; - // wxMotif doesn't yet have a wxTopLevelWindow implementation -#ifdef __WXMOTIF__ - wxFrame *winTop = wxDynamicCast(parent, wxFrame); -#else wxTopLevelWindow *winTop = wxDynamicCast(parent, wxTopLevelWindow); -#endif if ( winTop ) { iconized = winTop->IsIconized(); } -#ifndef __WXMOTIF__ else { wxFAIL_MSG(wxT("should have a top level parent!")); iconized = FALSE; } -#endif if ( iconized ) { @@ -398,20 +362,14 @@ void wxSplitterWindow::OnSize(wxSizeEvent& event) return; } - int cw, ch; - GetClientSize( &cw, &ch ); if ( m_windowTwo ) { - if ( m_splitMode == wxSPLIT_VERTICAL ) - { - if ( m_sashPosition >= (cw - 5) ) - SetSashPositionAndNotify(wxMax(10, cw - 40)); - } - else // m_splitMode == wxSPLIT_HORIZONTAL - { - if ( m_sashPosition >= (ch - 5) ) - SetSashPositionAndNotify(wxMax(10, ch - 40)); - } + int w, h; + GetClientSize(&w, &h); + + int size = m_splitMode == wxSPLIT_VERTICAL ? w : h; + if ( m_sashPosition >= size - 5 ) + SetSashPositionAndNotify(wxMax(10, size - 40)); } SizeWindows(); @@ -422,194 +380,47 @@ bool wxSplitterWindow::SashHitTest(int x, int y, int tolerance) if ( m_windowTwo == NULL || m_sashPosition == 0) return FALSE; // No sash - if ( m_splitMode == wxSPLIT_VERTICAL ) - { - if ( (x >= m_sashPosition - tolerance) && (x <= m_sashPosition + m_sashSize + tolerance) ) - return TRUE; - else - return FALSE; - } - else - { - if ( (y >= (m_sashPosition- tolerance)) && (y <= (m_sashPosition + m_sashSize + tolerance)) ) - return TRUE; - else - return FALSE; - } + int z = m_splitMode == wxSPLIT_VERTICAL ? x : y; + + return z >= m_sashPosition - tolerance && z <= m_sashPosition + tolerance; } -// Draw 3D effect borders -void wxSplitterWindow::DrawBorders(wxDC& dc) +int wxSplitterWindow::GetSashSize() const { - int w, h; - GetClientSize(&w, &h); - - if ( GetWindowStyleFlag() & wxSP_3DBORDER ) - { - - dc.SetPen(*m_facePen); - dc.SetBrush(*m_faceBrush); - dc.DrawRectangle(1, 1 , w-1, m_borderSize-2 ); //high - dc.DrawRectangle(1, m_borderSize-2 , m_borderSize-2, h-1 ); // left - dc.DrawRectangle(w-m_borderSize+2, m_borderSize-2 , w-1, h-1 ); // right - dc.DrawRectangle(m_borderSize-2, h-m_borderSize+2 , w-m_borderSize+2, h-1 ); //bottom - - dc.SetPen(*m_mediumShadowPen); - dc.DrawLine(m_borderSize-2, m_borderSize-2, w-m_borderSize+1, m_borderSize-2); - dc.DrawLine(m_borderSize-2, m_borderSize-2, m_borderSize-2, h-m_borderSize+1); - - dc.SetPen(*m_darkShadowPen); - dc.DrawLine(m_borderSize-1, m_borderSize-1, w-m_borderSize, m_borderSize-1); - dc.DrawLine(m_borderSize-1, m_borderSize-1, m_borderSize-1, h-m_borderSize); - - dc.SetPen(*m_hilightPen); - dc.DrawLine(m_borderSize - 2, h-m_borderSize+1, w-m_borderSize+1, h-m_borderSize+1); - dc.DrawLine(w-m_borderSize+1, m_borderSize - 2, w-m_borderSize+1, h-m_borderSize+2); // Surely the maximum y pos. should be h - 1. - /// Anyway, h is required for MSW. - - dc.SetPen(*m_lightShadowPen); - dc.DrawLine(w-m_borderSize, m_borderSize-1, w-m_borderSize, h-m_borderSize); // Right hand side - dc.DrawLine(m_borderSize-1, h-m_borderSize, w-m_borderSize+1, h-m_borderSize); // Bottom - } - else if ( GetWindowStyleFlag() & wxSP_BORDER ) - { - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.SetPen(*wxBLACK_PEN); - dc.DrawRectangle(0, 0, w-1, h-1); - } + return wxRendererNative::Get().GetSplitterSashAndBorder(this).x; +} - dc.SetPen(wxNullPen); - dc.SetBrush(wxNullBrush); +int wxSplitterWindow::GetBorderSize() const +{ + return wxRendererNative::Get().GetSplitterSashAndBorder(this).y; } // Draw the sash void wxSplitterWindow::DrawSash(wxDC& dc) { - if ( m_sashPosition == 0 || !m_windowTwo) + wxRendererNative::Get().DrawSplitterBorder + ( + this, + dc, + GetClientRect() + ); + + // don't draw sash if we're not split + if ( m_sashPosition == 0 || !m_windowTwo ) return; - if (GetWindowStyle() & wxSP_NOSASH) - return; - - int w, h; - GetClientSize(&w, &h); - - if ( GetWindowStyleFlag() & wxSP_3DSASH ) - { - if ( m_splitMode == wxSPLIT_VERTICAL ) - { - dc.SetPen(*m_facePen); - - if (HasFlag( wxSP_SASH_AQUA )) - dc.SetBrush(*wxWHITE_BRUSH); - else - dc.SetBrush(*m_faceBrush); - dc.DrawRectangle(m_sashPosition + 2, 0 , m_sashSize - 4, h ); - - dc.SetBrush(*wxTRANSPARENT_BRUSH); - - dc.SetPen(*m_lightShadowPen); - int xShadow = m_borderSize ? m_borderSize - 1 : 0 ; - dc.DrawLine(m_sashPosition, xShadow , m_sashPosition, h-m_borderSize); - - dc.SetPen(*m_hilightPen); - dc.DrawLine(m_sashPosition+1, m_borderSize - 2, m_sashPosition+1, h - m_borderSize+2); - - if (!HasFlag( wxSP_SASH_AQUA )) - dc.SetPen(*m_mediumShadowPen); - - int yMedium = m_borderSize ? h-m_borderSize+1 : h ; - dc.DrawLine(m_sashPosition+m_sashSize-2, xShadow, m_sashPosition+m_sashSize-2, yMedium); - - if (HasFlag( wxSP_SASH_AQUA )) - dc.SetPen(*m_lightShadowPen); - else - dc.SetPen(*m_darkShadowPen); - dc.DrawLine(m_sashPosition+m_sashSize-1, m_borderSize, m_sashPosition+m_sashSize-1, h-m_borderSize ); - - // Draw the top and bottom edges of the sash, if requested - if (GetWindowStyle() & wxSP_FULLSASH) - { - // Top - dc.SetPen(*m_hilightPen); - dc.DrawLine(m_sashPosition+1, m_borderSize, m_sashPosition+m_sashSize-1, m_borderSize); - - // Bottom - dc.SetPen(*m_darkShadowPen); - dc.DrawLine(m_sashPosition+1, h-m_borderSize-1, m_sashPosition+m_sashSize-1, h-m_borderSize-1); - } - } - else // wxSPLIT_HORIZONTAL - { - dc.SetPen(*m_facePen); - if (HasFlag( wxSP_SASH_AQUA )) - dc.SetBrush(*wxWHITE_BRUSH); - else - dc.SetBrush(*m_faceBrush); - dc.DrawRectangle( m_borderSize-2, m_sashPosition + 2, w-m_borderSize+2, m_sashSize - 4); - - dc.SetBrush(*wxTRANSPARENT_BRUSH); - - dc.SetPen(*m_lightShadowPen); - dc.DrawLine(m_borderSize-1, m_sashPosition, w-m_borderSize, m_sashPosition); - - dc.SetPen(*m_hilightPen); - dc.DrawLine(m_borderSize-2, m_sashPosition+1, w-m_borderSize+1, m_sashPosition+1); - if (!HasFlag( wxSP_SASH_AQUA )) - dc.SetPen(*m_mediumShadowPen); - dc.DrawLine(m_borderSize-1, m_sashPosition+m_sashSize-2, w-m_borderSize+1, m_sashPosition+m_sashSize-2); - - if (HasFlag( wxSP_SASH_AQUA )) - dc.SetPen(*m_lightShadowPen); - else - dc.SetPen(*m_darkShadowPen); - dc.DrawLine(m_borderSize, m_sashPosition+m_sashSize-1, w-m_borderSize, m_sashPosition+m_sashSize-1); - - // Draw the left and right edges of the sash, if requested - if (GetWindowStyle() & wxSP_FULLSASH) - { - // Left - dc.SetPen(*m_hilightPen); - dc.DrawLine(m_borderSize, m_sashPosition, m_borderSize, m_sashPosition+m_sashSize); - - // Right - dc.SetPen(*m_darkShadowPen); - dc.DrawLine(w-m_borderSize-1, m_sashPosition+1, w-m_borderSize-1, m_sashPosition+m_sashSize-1); - } - } - } - else // !wxSP_3DSASH - { - dc.SetPen(*wxTRANSPARENT_PEN); - dc.SetBrush(*m_faceBrush); - if ( m_splitMode == wxSPLIT_VERTICAL ) - { - int h1 = h-1; - int y1 = 0; - if ( (GetWindowStyleFlag() & wxSP_BORDER) != wxSP_BORDER && (GetWindowStyleFlag() & wxSP_3DBORDER) != wxSP_3DBORDER ) - h1 += 1; // Not sure why this is necessary... - if ( (GetWindowStyleFlag() & wxSP_3DBORDER) == wxSP_3DBORDER) - { - y1 = 2; h1 -= 3; - } - dc.DrawRectangle(m_sashPosition, y1, m_sashSize, h1); - } - else // wxSPLIT_HORIZONTAL - { - int w1 = w-1; - int x1 = 0; - if ( (GetWindowStyleFlag() & wxSP_BORDER) != wxSP_BORDER && (GetWindowStyleFlag() & wxSP_3DBORDER) != wxSP_3DBORDER ) - w1 ++; - if ( (GetWindowStyleFlag() & wxSP_3DBORDER) == wxSP_3DBORDER) - { - x1 = 2; w1 -= 3; - } - dc.DrawRectangle(x1, m_sashPosition, w1, m_sashSize); - } - } + // nor if we're configured to not show it + if ( HasFlag(wxSP_NOSASH) ) + return; - dc.SetPen(wxNullPen); - dc.SetBrush(wxNullBrush); + wxMirrorDC dcMirror(dc, m_splitMode != wxSPLIT_VERTICAL); + wxRendererNative::Get().DrawSplitterSash + ( + this, + dcMirror, + dcMirror.Reflect(GetClientSize()), + m_sashPosition + ); } // Draw the sash tracker (for whilst moving the sash) @@ -663,9 +474,6 @@ void wxSplitterWindow::DrawSashTracker(int x, int y) screenDC.DrawLine(x1, y1, x2, y2); screenDC.SetLogicalFunction(wxCOPY); - - screenDC.SetPen(wxNullPen); - screenDC.SetBrush(wxNullBrush); } int wxSplitterWindow::GetWindowSize() const @@ -770,32 +578,37 @@ void wxSplitterWindow::SizeWindows() } else if ( GetWindow1() && GetWindow2() ) { - if (GetSplitMode() == wxSPLIT_VERTICAL) + const int border = GetBorderSize(), + sash = GetSashSize(); + + int size1 = GetSashPosition() - border, + size2 = GetSashPosition() + sash; + + int x2, y2, w1, h1, w2, h2; + if ( GetSplitMode() == wxSPLIT_VERTICAL ) { - int x1 = GetBorderSize(); - int y1 = GetBorderSize(); - int w1 = GetSashPosition() - GetBorderSize(); - int h1 = h - 2*GetBorderSize(); - - int x2 = GetSashPosition() + GetSashSize(); - int y2 = GetBorderSize(); - int w2 = w - 2*GetBorderSize() - GetSashSize() - w1; - int h2 = h - 2*GetBorderSize(); - - GetWindow1()->SetSize(x1, y1, w1, h1); - GetWindow2()->SetSize(x2, y2, w2, h2); + w1 = size1; + w2 = w - 2*border - sash - w1; + h1 = + h2 = h - 2*border; + x2 = size2; + y2 = border; } - else + else // horz splitter { - GetWindow1()->SetSize(GetBorderSize(), GetBorderSize(), - w - 2*GetBorderSize(), GetSashPosition() - GetBorderSize()); - GetWindow2()->SetSize(GetBorderSize(), GetSashPosition() + GetSashSize(), - w - 2*GetBorderSize(), h - 2*GetBorderSize() - GetSashSize() - (GetSashPosition() - GetBorderSize())); + w1 = + w2 = w - 2*border; + h1 = size1; + h2 = h - 2*border - sash - h1; + x2 = border; + y2 = size2; } + + GetWindow1()->SetSize(border, border, w1, h1); + GetWindow2()->SetSize(x2, y2, w2, h2); } + wxClientDC dc(this); - if ( GetBorderSize() > 0 ) - DrawBorders(dc); DrawSash(dc); SetNeedUpdating(FALSE); @@ -936,43 +749,6 @@ void wxSplitterWindow::SetSashPosition(int position, bool redraw) } } -// Initialize colours -void wxSplitterWindow::InitColours() -{ - wxDELETE( m_facePen ); - wxDELETE( m_faceBrush ); - wxDELETE( m_mediumShadowPen ); - wxDELETE( m_darkShadowPen ); - wxDELETE( m_lightShadowPen ); - wxDELETE( m_hilightPen ); - - // Shadow colours -#ifndef __WIN16__ - wxColour faceColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); - m_facePen = new wxPen(faceColour, 1, wxSOLID); - m_faceBrush = new wxBrush(faceColour, wxSOLID); - - wxColour mediumShadowColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)); - m_mediumShadowPen = new wxPen(mediumShadowColour, 1, wxSOLID); - - wxColour darkShadowColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW)); - m_darkShadowPen = new wxPen(darkShadowColour, 1, wxSOLID); - - wxColour lightShadowColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT)); - m_lightShadowPen = new wxPen(lightShadowColour, 1, wxSOLID); - - wxColour hilightColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT)); - m_hilightPen = new wxPen(hilightColour, 1, wxSOLID); -#else - m_facePen = new wxPen("LIGHT GREY", 1, wxSOLID); - m_faceBrush = new wxBrush("LIGHT GREY", wxSOLID); - m_mediumShadowPen = new wxPen("GREY", 1, wxSOLID); - m_darkShadowPen = new wxPen("BLACK", 1, wxSOLID); - m_lightShadowPen = new wxPen("LIGHT GREY", 1, wxSOLID); - m_hilightPen = new wxPen("WHITE", 1, wxSOLID); -#endif // __WIN16__ -} - bool wxSplitterWindow::DoSendEvent(wxSplitterEvent& event) { return !GetEventHandler()->ProcessEvent(event) || event.IsAllowed(); @@ -1102,6 +878,7 @@ void wxSplitterWindow::OnSetCursor(wxSetCursorEvent& event) //else: do nothing, in particular, don't call Skip() } +#endif // wxMSW || wxMac + #endif // wxUSE_SPLITTER -#endif // wxMSW diff --git a/src/mac/carbon/renderer.cpp b/src/mac/carbon/renderer.cpp index f295b9861a..5a14e7f08e 100644 --- a/src/mac/carbon/renderer.cpp +++ b/src/mac/carbon/renderer.cpp @@ -49,6 +49,12 @@ public: const wxRect& rect, int flags = 0); + // draw a (vertical) sash + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position); + private: // the tree buttons wxBitmap m_bmpTreeExpanded, @@ -185,3 +191,20 @@ wxRendererMac::DrawTreeItemButton(wxWindow *win, #endif // 0/1 } +void +wxRendererMac::DrawSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position) +{ + // VZ: we have to somehow determine if we're drawing a normal sash or + // a brushed metal one as they look quite differently... this is + // completely bogus anyhow, of course (TODO) + + const wxCoord h = size.y; + + dc.SetPen(*wxLIGHT_GREY_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(position, 0, 7, h); +} + diff --git a/src/mac/renderer.cpp b/src/mac/renderer.cpp index f295b9861a..5a14e7f08e 100644 --- a/src/mac/renderer.cpp +++ b/src/mac/renderer.cpp @@ -49,6 +49,12 @@ public: const wxRect& rect, int flags = 0); + // draw a (vertical) sash + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position); + private: // the tree buttons wxBitmap m_bmpTreeExpanded, @@ -185,3 +191,20 @@ wxRendererMac::DrawTreeItemButton(wxWindow *win, #endif // 0/1 } +void +wxRendererMac::DrawSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position) +{ + // VZ: we have to somehow determine if we're drawing a normal sash or + // a brushed metal one as they look quite differently... this is + // completely bogus anyhow, of course (TODO) + + const wxCoord h = size.y; + + dc.SetPen(*wxLIGHT_GREY_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(position, 0, 7, h); +} + -- 2.45.2