Allow wxPG to take focus on the entire area even if wxPG is not a standalone control.

By default, to prevent wxPG from stealing focus from other controls, focus is moved to the grid only if it was already in one of its child controls.
When newly introduced wxPG_EX_ALWAYS_ALLOW_FOCUS flag is set then wxPG can take focus on the entire grid area (on canvas) even if focus is moved from another control.
Default wxPG behavior remains unchanged because wxPG_EX_ALWAYS_ALLOW_FOCUS flag must be explicitly set with wxPropertyGrid::SetExtraStyle function.

Closes #16993.
This commit is contained in:
Artur Wieczorek
2015-05-21 18:51:08 +02:00
parent f583ba0ffb
commit 7394dd8e1f
3 changed files with 31 additions and 13 deletions

View File

@@ -335,8 +335,16 @@ wxPG_EX_NO_TOOLBAR_DIVIDER = 0x08000000,
/** Show a separator below the toolbar. /** Show a separator below the toolbar.
*/ */
wxPG_EX_TOOLBAR_SEPARATOR = 0x10000000 wxPG_EX_TOOLBAR_SEPARATOR = 0x10000000,
/** Allows to take focus on the entire area (on canvas)
even if wxPropertyGrid is not a standalone control.
*/
wxPG_EX_ALWAYS_ALLOW_FOCUS = 0x00100000,
/** A mask which can be used to filter (out) all extra styles.
*/
wxPG_EX_WINDOW_STYLE_MASK = 0x1FFFF000
}; };
#if wxPG_COMPATIBILITY_1_4 #if wxPG_COMPATIBILITY_1_4

View File

@@ -663,7 +663,7 @@ bool wxPropertyGridManager::SetFont( const wxFont& font )
void wxPropertyGridManager::SetExtraStyle( long exStyle ) void wxPropertyGridManager::SetExtraStyle( long exStyle )
{ {
wxWindow::SetExtraStyle( exStyle ); wxWindow::SetExtraStyle( exStyle );
m_pPropGrid->SetExtraStyle( exStyle & 0xFFFFF000 ); m_pPropGrid->SetExtraStyle( exStyle & wxPG_EX_WINDOW_STYLE_MASK );
#if wxUSE_TOOLBAR #if wxUSE_TOOLBAR
if ( (exStyle & (wxPG_EX_NO_FLAT_TOOLBAR|wxPG_EX_MODE_BUTTONS)) && m_pToolbar ) if ( (exStyle & (wxPG_EX_NO_FLAT_TOOLBAR|wxPG_EX_MODE_BUTTONS)) && m_pToolbar )
RecreateControls(); RecreateControls();

View File

@@ -4712,21 +4712,31 @@ void wxPropertyGrid::SetVirtualWidth( int width )
void wxPropertyGrid::SetFocusOnCanvas() void wxPropertyGrid::SetFocusOnCanvas()
{ {
// To prevent wxPropertyGrid from stealing focus from other controls, // By default, to prevent wxPropertyGrid from stealing focus from
// only move focus to the grid if it was already in one if its child // other controls, only move focus to the grid if it was already
// controls. // in one of its child controls.
wxWindow* focus = wxWindow::FindFocus(); // If wxPG_EX_ALWAYS_ALLOW_FOCUS flag is set then wxPropertyGrid
if ( focus ) // can take focus on the entire grid area (canvas) even if focus
// is moved from another control.
if ( HasExtraStyle(wxPG_EX_ALWAYS_ALLOW_FOCUS) )
{ {
wxWindow* parent = focus->GetParent(); SetFocus();
while ( parent ) }
else
{
wxWindow* focus = wxWindow::FindFocus();
if ( focus )
{ {
if ( parent == this ) wxWindow* parent = focus->GetParent();
while ( parent )
{ {
SetFocus(); if ( parent == this )
break; {
SetFocus();
break;
}
parent = parent->GetParent();
} }
parent = parent->GetParent();
} }
} }