From 0fa8508d0c6343d11178758f00fa68ae00721809 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 7 Aug 2004 14:09:39 +0000 Subject: [PATCH] moving focus rect overlap problems to the vis region of a window git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28696 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/mac/carbon/spinctrl.cpp | 25 ++++++++++++++++--------- src/mac/carbon/window.cpp | 25 +++++++++++++++++++------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/mac/carbon/spinctrl.cpp b/src/mac/carbon/spinctrl.cpp index fe8e0b1edc..2a2b77c91d 100644 --- a/src/mac/carbon/spinctrl.cpp +++ b/src/mac/carbon/spinctrl.cpp @@ -25,8 +25,11 @@ // constants // ---------------------------------------------------------------------------- +// the focus rect around a text may have 4 pixels in each direction +// we handle these problems right now in an extended vis region of a window +static const wxCoord TEXTBORDER = 0 ; // the margin between the text control and the spin -static const wxCoord MARGIN = 8; +static const wxCoord MARGIN = 8 - TEXTBORDER; // ---------------------------------------------------------------------------- // wxSpinCtrlText: text control used by spin control @@ -36,7 +39,7 @@ class wxSpinCtrlText : public wxTextCtrl { public: wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value) - : wxTextCtrl(spin , -1, value, wxDefaultPosition, wxSize(40, 22)) + : wxTextCtrl(spin , -1, value, wxDefaultPosition, wxSize(40, -1)) { m_spin = spin; @@ -177,7 +180,9 @@ bool wxSpinCtrl::Create(wxWindow *parent, } if ( size.y == -1 ) { - csize.y = m_text->GetSize().y + 4; //allow for text border highlights + csize.y = m_text->GetSize().y + 2 * TEXTBORDER ; //allow for text border highlights + if ( m_btn->GetSize().y > csize.y ) + csize.y = m_btn->GetSize().y ; } //SetSize(csize); @@ -211,28 +216,30 @@ wxSize wxSpinCtrl::DoGetBestSize() const wxSize sizeBtn = m_btn->GetBestSize(), sizeText = m_text->GetBestSize(); + sizeText.y += 2 * TEXTBORDER ; + sizeText.x += 2 * TEXTBORDER ; + int height; if (sizeText.y > sizeBtn.y) height = sizeText.y; else height = sizeBtn.y; - return wxSize(sizeBtn.x + sizeText.x + MARGIN, height + MARGIN); + return wxSize(sizeBtn.x + sizeText.x + MARGIN, height ); } void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) { // position the subcontrols inside the client area wxSize sizeBtn = m_btn->GetSize(); + wxSize sizeText = m_text->GetSize(); wxControl::DoMoveWindow(x, y, width, height); - wxCoord wText = width - sizeBtn.x - MARGIN; + wxCoord wText = width - sizeBtn.x - MARGIN - 2 * TEXTBORDER; - //growing or shrinking a control like this doesn't really make sense - //so just leave the controls the same size and add whitespace - m_text->SetSize(2, 2, wText, 22); - m_btn->SetSize(0 + wText + MARGIN, 0, -1, height); + m_text->SetSize(TEXTBORDER, (height - sizeText.y) / 2, wText, -1); + m_btn->SetSize(0 + wText + MARGIN + 2 * TEXTBORDER , (height - sizeBtn.y) / 2 , -1, -1 ); } // ---------------------------------------------------------------------------- diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 199f23f208..89bcabf656 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -36,6 +36,8 @@ #include "wx/log.h" #include "wx/geometry.h" #include "wx/textctrl.h" +#include "wx/laywin.h" +#include "wx/splitter.h" #include "wx/toolbar.h" #include "wx/dc.h" @@ -2591,7 +2593,11 @@ wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const } wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) { - + // includeOuterStructures is true if we try to draw somthing like a focus ring etc. + // also a window dc uses this, in this case we only clip in the hierarchy for hard + // borders like a scrollwindow, splitter etc otherwise we end up in a paranoia having + // to add focus borders everywhere + Rect r ; RgnHandle visRgn = NewRgn() ; RgnHandle tempRgn = NewRgn() ; @@ -2644,12 +2650,19 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) parent->MacWindowToRootWindow( &x, &y ) ; MacRootWindowToWindow( &x , &y ) ; - SetRectRgn( tempRgn , - x + parent->MacGetLeftBorderSize() , y + parent->MacGetTopBorderSize() , - x + size.x - parent->MacGetRightBorderSize(), - y + size.y - parent->MacGetBottomBorderSize()) ; + if ( !includeOuterStructures || ( + parent->IsKindOf( CLASSINFO( wxScrolledWindow ) ) || + parent->IsKindOf( CLASSINFO( wxSashLayoutWindow ) ) || + ( parent->GetParent() && parent->GetParent()->IsKindOf( CLASSINFO( wxSplitterWindow ) ) ) + ) ) + { + SetRectRgn( tempRgn , + x + parent->MacGetLeftBorderSize() , y + parent->MacGetTopBorderSize() , + x + size.x - parent->MacGetRightBorderSize(), + y + size.y - parent->MacGetBottomBorderSize()) ; - SectRgn( visRgn , tempRgn , visRgn ) ; + SectRgn( visRgn , tempRgn , visRgn ) ; + } if ( parent->IsTopLevel() ) break ; child = parent ;