Have wxPropertyGrid inherit from wxControl and wxScrollHelper instead of wxScrolledWindow. This is the approach other scrolled controls use.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65628 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli
2010-09-24 14:47:20 +00:00
parent ff94c563ed
commit 2e2e62def1
4 changed files with 95 additions and 74 deletions

View File

@@ -712,8 +712,9 @@ enum wxPG_SET_SPLITTER_POSITION_SPLITTER_FLAGS
@library{wxpropgrid} @library{wxpropgrid}
@category{propgrid} @category{propgrid}
*/ */
class WXDLLIMPEXP_PROPGRID class WXDLLIMPEXP_PROPGRID wxPropertyGrid : public wxControl,
wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface public wxScrollHelper,
public wxPropertyGridInterface
{ {
friend class wxPropertyGridEvent; friend class wxPropertyGridEvent;
friend class wxPropertyGridPageState; friend class wxPropertyGridPageState;
@@ -735,7 +736,7 @@ public:
#endif #endif
/** The default constructor. The styles to be used are styles valid for /** The default constructor. The styles to be used are styles valid for
the wxWindow and wxScrolledWindow. the wxWindow.
@see @link wndflags Additional Window Styles @endlink @see @link wndflags Additional Window Styles @endlink
*/ */
@@ -1039,7 +1040,7 @@ public:
@param pt @param pt
Coordinates in the virtual grid space. You may need to use Coordinates in the virtual grid space. You may need to use
wxScrolledWindow::CalcScrolledPosition() for translating wxScrolled<T>::CalcScrolledPosition() for translating
wxPropertyGrid client coordinates into something this member wxPropertyGrid client coordinates into something this member
function can use. function can use.
*/ */
@@ -1838,12 +1839,7 @@ protected:
/** Current cursor id. */ /** Current cursor id. */
int m_curcursor; int m_curcursor;
/** // Caption font. Same as normal font plus bold style.
This captionFont is made equal to the font of the wxScrolledWindow.
As extra the bold face is set on it when this is wanted by the user
(see flags)
*/
wxFont m_captionFont; wxFont m_captionFont;
int m_fontHeight; // Height of the font. int m_fontHeight; // Height of the font.
@@ -2110,7 +2106,7 @@ protected:
void CorrectEditorWidgetPosY(); void CorrectEditorWidgetPosY();
int DoDrawItems( wxDC& dc, int DoDrawItems( wxDC& dc,
const wxRect* drawRect, const wxRect* itemsRect,
bool isBuffered ) const; bool isBuffered ) const;
/** Draws an expand/collapse (ie. +/-) button. /** Draws an expand/collapse (ie. +/-) button.
@@ -2122,7 +2118,7 @@ protected:
void DrawItems( wxDC& dc, void DrawItems( wxDC& dc,
unsigned int topItemY, unsigned int topItemY,
unsigned int bottomItemY, unsigned int bottomItemY,
const wxRect* drawRect = NULL ); const wxRect* itemsRect = NULL );
// Translate wxKeyEvent to wxPG_ACTION_XXX // Translate wxKeyEvent to wxPG_ACTION_XXX
int KeyEventToActions(wxKeyEvent &event, int* pSecond) const; int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;

View File

@@ -590,7 +590,7 @@ public:
@param pt @param pt
Logical coordinates in the virtual grid space. Use Logical coordinates in the virtual grid space. Use
wxScrolledWindow::CalcUnscrolledPosition() if you need to wxScrolled<T>::CalcUnscrolledPosition() if you need to
translate a scrolled position into a logical one. translate a scrolled position into a logical one.
*/ */
wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const; wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const;

View File

@@ -439,7 +439,9 @@ typedef int (*wxPGSortCallback)(wxPropertyGrid* propGrid,
@category{propgrid} @category{propgrid}
@appearance{propertygrid.png} @appearance{propertygrid.png}
*/ */
class wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface class wxPropertyGrid : public wxControl,
public wxScrollHelper,
public wxPropertyGridInterface
{ {
public: public:
/** /**
@@ -450,7 +452,7 @@ public:
/** /**
Constructor. Constructor.
The styles to be used are styles valid for the wxWindow and wxScrolledWindow. The styles to be used are styles valid for the wxWindow.
@see @ref propgrid_window_styles. @see @ref propgrid_window_styles.
*/ */
@@ -810,7 +812,7 @@ public:
@param pt @param pt
Coordinates in the virtual grid space. You may need to use Coordinates in the virtual grid space. You may need to use
wxScrolledWindow::CalcScrolledPosition() for translating wxScrolled<T>::CalcScrolledPosition() for translating
wxPropertyGrid client coordinates into something this member wxPropertyGrid client coordinates into something this member
function can use. function can use.
*/ */

View File

@@ -246,9 +246,9 @@ void wxPropertyGridInitGlobalsIfNeeded()
// wxPropertyGrid // wxPropertyGrid
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxPropertyGrid, wxScrolledWindow) IMPLEMENT_DYNAMIC_CLASS(wxPropertyGrid, wxControl)
BEGIN_EVENT_TABLE(wxPropertyGrid, wxScrolledWindow) BEGIN_EVENT_TABLE(wxPropertyGrid, wxControl)
EVT_IDLE(wxPropertyGrid::OnIdle) EVT_IDLE(wxPropertyGrid::OnIdle)
EVT_PAINT(wxPropertyGrid::OnPaint) EVT_PAINT(wxPropertyGrid::OnPaint)
EVT_SIZE(wxPropertyGrid::OnResize) EVT_SIZE(wxPropertyGrid::OnResize)
@@ -271,7 +271,7 @@ END_EVENT_TABLE()
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
wxPropertyGrid::wxPropertyGrid() wxPropertyGrid::wxPropertyGrid()
: wxScrolledWindow() : wxControl(), wxScrollHelper(this)
{ {
Init1(); Init1();
} }
@@ -284,7 +284,7 @@ wxPropertyGrid::wxPropertyGrid( wxWindow *parent,
const wxSize& size, const wxSize& size,
long style, long style,
const wxString& name ) const wxString& name )
: wxScrolledWindow() : wxControl(), wxScrollHelper(this)
{ {
Init1(); Init1();
Create(parent,id,pos,size,style,name); Create(parent,id,pos,size,style,name);
@@ -311,7 +311,10 @@ bool wxPropertyGrid::Create( wxWindow *parent,
style &= ~(wxTAB_TRAVERSAL); style &= ~(wxTAB_TRAVERSAL);
style |= wxWANTS_CHARS; style |= wxWANTS_CHARS;
wxScrolledWindow::Create(parent,id,pos,size,style,name); wxControl::Create(parent, id, pos, size,
style | wxScrolledWindowStyle,
wxDefaultValidator,
name);
Init2(); Init2();
@@ -470,10 +473,6 @@ void wxPropertyGrid::Init2()
m_timeCreated = ::wxGetLocalTimeMillis(); m_timeCreated = ::wxGetLocalTimeMillis();
//m_canvas->Create(this, wxID_ANY, wxPoint(0, 0), GetClientSize(),
// wxWANTS_CHARS | wxCLIP_CHILDREN);
SetBackgroundStyle( wxBG_STYLE_CUSTOM );
m_iFlags |= wxPG_FL_INITIALIZED; m_iFlags |= wxPG_FL_INITIALIZED;
m_ncWidth = wndsize.GetWidth(); m_ncWidth = wndsize.GetWidth();
@@ -572,7 +571,7 @@ bool wxPropertyGrid::Destroy()
if ( m_iFlags & wxPG_FL_MOUSE_CAPTURED ) if ( m_iFlags & wxPG_FL_MOUSE_CAPTURED )
ReleaseMouse(); ReleaseMouse();
return wxScrolledWindow::Destroy(); return wxControl::Destroy();
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -631,12 +630,12 @@ void wxPropertyGrid::SetWindowStyleFlag( long style )
// //
// Tooltips disabled // Tooltips disabled
// //
wxScrolledWindow::SetToolTip( NULL ); SetToolTip( NULL );
} }
#endif #endif
} }
wxScrolledWindow::SetWindowStyleFlag ( style ); wxControl::SetWindowStyleFlag ( style );
if ( m_iFlags & wxPG_FL_INITIALIZED ) if ( m_iFlags & wxPG_FL_INITIALIZED )
{ {
@@ -654,7 +653,7 @@ void wxPropertyGrid::Freeze()
{ {
if ( !m_frozen ) if ( !m_frozen )
{ {
wxScrolledWindow::Freeze(); wxControl::Freeze();
} }
m_frozen++; m_frozen++;
} }
@@ -667,7 +666,7 @@ void wxPropertyGrid::Thaw()
if ( !m_frozen ) if ( !m_frozen )
{ {
wxScrolledWindow::Thaw(); wxControl::Thaw();
RecalculateVirtualSize(); RecalculateVirtualSize();
#if wxPG_REFRESH_CONTROLS_AFTER_REPAINT #if wxPG_REFRESH_CONTROLS_AFTER_REPAINT
Refresh(); Refresh();
@@ -1130,7 +1129,7 @@ void wxPropertyGrid::SetExtraStyle( long exStyle )
} }
} }
wxScrolledWindow::SetExtraStyle( exStyle ); wxControl::SetExtraStyle( exStyle );
if ( exStyle & wxPG_EX_INIT_NOCAT ) if ( exStyle & wxPG_EX_INIT_NOCAT )
m_pState->InitNonCatMode(); m_pState->InitNonCatMode();
@@ -1236,7 +1235,7 @@ bool wxPropertyGrid::Reparent( wxWindowBase *newParent )
{ {
OnTLPChanging((wxWindow*)newParent); OnTLPChanging((wxWindow*)newParent);
bool res = wxScrolledWindow::Reparent(newParent); bool res = wxControl::Reparent(newParent);
return res; return res;
} }
@@ -1249,7 +1248,7 @@ void wxPropertyGrid::CalculateFontAndBitmapStuff( int vspacing )
{ {
int x = 0, y = 0; int x = 0, y = 0;
m_captionFont = wxScrolledWindow::GetFont(); m_captionFont = wxControl::GetFont();
GetTextExtent(wxS("jG"), &x, &y, 0, 0, &m_captionFont); GetTextExtent(wxS("jG"), &x, &y, 0, 0, &m_captionFont);
m_subgroup_extramargin = x + (x/2); m_subgroup_extramargin = x + (x/2);
@@ -1444,7 +1443,7 @@ bool wxPropertyGrid::SetFont( const wxFont& font )
// Must disable active editor. // Must disable active editor.
DoClearSelection(); DoClearSelection();
bool res = wxScrolledWindow::SetFont( font ); bool res = wxControl::SetFont( font );
if ( res && GetParent()) // may not have been Create()ed yet if SetFont called from SetWindowVariant if ( res && GetParent()) // may not have been Create()ed yet if SetFont called from SetWindowVariant
{ {
CalculateFontAndBitmapStuff( m_vspacing ); CalculateFontAndBitmapStuff( m_vspacing );
@@ -1830,6 +1829,9 @@ void wxPropertyGrid::OnPaint( wxPaintEvent& WXUNUSED(event) )
r.x = 0; r.x = 0;
r.width = GetClientSize().x; r.width = GetClientSize().x;
r.y = vy;
r.height = GetClientSize().y;
// Repaint this rectangle // Repaint this rectangle
DrawItems( dc, r.y, r.y + r.height, &r ); DrawItems( dc, r.y, r.y + r.height, &r );
@@ -1919,7 +1921,7 @@ void wxPropertyGrid::DrawExpanderButton( wxDC& dc, const wxRect& rect,
void wxPropertyGrid::DrawItems( wxDC& dc, void wxPropertyGrid::DrawItems( wxDC& dc,
unsigned int topItemY, unsigned int topItemY,
unsigned int bottomItemY, unsigned int bottomItemY,
const wxRect* drawRect ) const wxRect* itemsRect )
{ {
if ( m_frozen || if ( m_frozen ||
m_height < 1 || m_height < 1 ||
@@ -1929,15 +1931,25 @@ void wxPropertyGrid::DrawItems( wxDC& dc,
m_pState->EnsureVirtualHeight(); m_pState->EnsureVirtualHeight();
wxRect tempDrawRect; wxRect tempItemsRect;
if ( !drawRect ) if ( !itemsRect )
{ {
tempDrawRect = wxRect(0, topItemY, tempItemsRect = wxRect(0, topItemY,
m_pState->m_width, m_pState->m_width,
bottomItemY); bottomItemY);
drawRect = &tempDrawRect; itemsRect = &tempItemsRect;
} }
int vx, vy;
GetViewStart(&vx, &vy);
vx *= wxPG_PIXELS_PER_UNIT;
vy *= wxPG_PIXELS_PER_UNIT;
wxRect drawRect(itemsRect->x - vx,
itemsRect->y - vy,
itemsRect->width,
itemsRect->height);
// items added check // items added check
if ( m_pState->m_itemsAdded ) PrepareAfterItemsAdded(); if ( m_pState->m_itemsAdded ) PrepareAfterItemsAdded();
@@ -1955,7 +1967,7 @@ void wxPropertyGrid::DrawItems( wxDC& dc,
{ {
if ( !m_doubleBuffer ) if ( !m_doubleBuffer )
{ {
paintFinishY = drawRect->y; paintFinishY = itemsRect->y;
dcPtr = NULL; dcPtr = NULL;
} }
else else
@@ -1973,28 +1985,26 @@ void wxPropertyGrid::DrawItems( wxDC& dc,
if ( dcPtr ) if ( dcPtr )
{ {
dc.SetClippingRegion( *drawRect ); paintFinishY = DoDrawItems( *dcPtr, itemsRect, isBuffered );
paintFinishY = DoDrawItems( *dcPtr, drawRect, isBuffered ); int drawBottomY = itemsRect->y + itemsRect->height;
int drawBottomY = drawRect->y + drawRect->height;
// Clear area beyond last painted property // Clear area beyond last painted property
if ( paintFinishY < drawBottomY ) if ( paintFinishY < drawBottomY )
{ {
wxLogDebug("%i", paintFinishY);
dcPtr->SetPen(m_colEmptySpace); dcPtr->SetPen(m_colEmptySpace);
dcPtr->SetBrush(m_colEmptySpace); dcPtr->SetBrush(m_colEmptySpace);
dcPtr->DrawRectangle(0, paintFinishY, dcPtr->DrawRectangle(0, paintFinishY,
m_width, m_width,
drawBottomY ); drawBottomY );
} }
dc.DestroyClippingRegion();
} }
#if wxPG_DOUBLE_BUFFER #if wxPG_DOUBLE_BUFFER
if ( bufferDC ) if ( bufferDC )
{ {
dc.Blit( drawRect->x, drawRect->y, drawRect->width, dc.Blit( drawRect.x, drawRect.y, drawRect.width,
drawRect->height, drawRect.height,
bufferDC, 0, 0, wxCOPY ); bufferDC, 0, 0, wxCOPY );
delete bufferDC; delete bufferDC;
} }
@@ -2005,29 +2015,29 @@ void wxPropertyGrid::DrawItems( wxDC& dc,
// Just clear the area // Just clear the area
dc.SetPen(m_colEmptySpace); dc.SetPen(m_colEmptySpace);
dc.SetBrush(m_colEmptySpace); dc.SetBrush(m_colEmptySpace);
dc.DrawRectangle(*drawRect); dc.DrawRectangle(drawRect);
} }
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
int wxPropertyGrid::DoDrawItems( wxDC& dc, int wxPropertyGrid::DoDrawItems( wxDC& dc,
const wxRect* drawRect, const wxRect* itemsRect,
bool isBuffered ) const bool isBuffered ) const
{ {
const wxPGProperty* firstItem; const wxPGProperty* firstItem;
const wxPGProperty* lastItem; const wxPGProperty* lastItem;
firstItem = DoGetItemAtY(drawRect->y); firstItem = DoGetItemAtY(itemsRect->y);
lastItem = DoGetItemAtY(drawRect->y+drawRect->height-1); lastItem = DoGetItemAtY(itemsRect->y+itemsRect->height-1);
if ( !lastItem ) if ( !lastItem )
lastItem = GetLastItem( wxPG_ITERATE_VISIBLE ); lastItem = GetLastItem( wxPG_ITERATE_VISIBLE );
if ( m_frozen || m_height < 1 || firstItem == NULL ) if ( m_frozen || m_height < 1 || firstItem == NULL )
return drawRect->y; return itemsRect->y;
wxCHECK_MSG( !m_pState->m_itemsAdded, drawRect->y, wxCHECK_MSG( !m_pState->m_itemsAdded, itemsRect->y,
"no items added" ); "no items added" );
wxASSERT( m_pState->m_properties->GetChildCount() ); wxASSERT( m_pState->m_properties->GetChildCount() );
@@ -2036,8 +2046,8 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc,
int firstItemTopY; int firstItemTopY;
int lastItemBottomY; int lastItemBottomY;
firstItemTopY = drawRect->y; firstItemTopY = itemsRect->y;
lastItemBottomY = drawRect->y + drawRect->height; lastItemBottomY = itemsRect->y + itemsRect->height;
// Align y coordinates to item boundaries // Align y coordinates to item boundaries
firstItemTopY -= firstItemTopY % lh; firstItemTopY -= firstItemTopY % lh;
@@ -2047,20 +2057,20 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc,
// Entire range outside scrolled, visible area? // Entire range outside scrolled, visible area?
if ( firstItemTopY >= (int)m_pState->GetVirtualHeight() || if ( firstItemTopY >= (int)m_pState->GetVirtualHeight() ||
lastItemBottomY <= 0 ) lastItemBottomY <= 0 )
return drawRect->y; return itemsRect->y;
wxCHECK_MSG( firstItemTopY < lastItemBottomY, wxCHECK_MSG( firstItemTopY < lastItemBottomY,
drawRect->y, itemsRect->y,
"invalid y values" ); "invalid y values" );
/* /*
wxLogDebug(" -> DoDrawItems ( \"%s\" -> \"%s\" wxLogDebug(" -> DoDrawItems ( \"%s\" -> \"%s\"
"height=%i (ch=%i), drawRect = 0x%lX )", "height=%i (ch=%i), itemsRect = 0x%lX )",
firstItem->GetLabel().c_str(), firstItem->GetLabel().c_str(),
lastItem->GetLabel().c_str(), lastItem->GetLabel().c_str(),
(int)(lastItemBottomY - firstItemTopY), (int)(lastItemBottomY - firstItemTopY),
(int)m_height, (int)m_height,
(unsigned long)drawRect ); (unsigned long)&itemsRect );
*/ */
wxRect r; wxRect r;
@@ -2071,7 +2081,7 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc,
// //
// With wxPG_DOUBLE_BUFFER, do double buffering // With wxPG_DOUBLE_BUFFER, do double buffering
// - buffer's y = 0, so align drawRect and coordinates to that // - buffer's y = 0, so align itemsRect and coordinates to that
// //
#if wxPG_DOUBLE_BUFFER #if wxPG_DOUBLE_BUFFER
int yRelMod = 0; int yRelMod = 0;
@@ -2080,15 +2090,15 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc,
if ( isBuffered ) if ( isBuffered )
{ {
xRelMod = drawRect->x; xRelMod = itemsRect->x;
yRelMod = drawRect->y; yRelMod = itemsRect->y;
// //
// drawRect conversion // itemsRect conversion
cr2 = *drawRect; cr2 = *itemsRect;
cr2.x -= xRelMod; cr2.x -= xRelMod;
cr2.y -= yRelMod; cr2.y -= yRelMod;
drawRect = &cr2; itemsRect = &cr2;
firstItemTopY -= yRelMod; firstItemTopY -= yRelMod;
lastItemBottomY -= yRelMod; lastItemBottomY -= yRelMod;
} }
@@ -4651,7 +4661,7 @@ void wxPropertyGrid::SetVirtualWidth( int width )
void wxPropertyGrid::SetFocusOnCanvas() void wxPropertyGrid::SetFocusOnCanvas()
{ {
SetFocusIgnoringChildren(); SetFocus();
m_editorFocused = 0; m_editorFocused = 0;
} }
@@ -4783,7 +4793,10 @@ bool wxPropertyGrid::HandleMouseClick( int x, unsigned int y, wxMouseEvent &even
else DoExpand( p, true ); else DoExpand( p, true );
} }
res = false; // Do not Skip() the event after selection has been made.
// Otherwise default event handling behavior kicks in
// and may revert focus back to the main canvas.
res = true;
} }
else else
{ {
@@ -5264,9 +5277,13 @@ void wxPropertyGrid::OnMouseClick( wxMouseEvent &event )
int x, y; int x, y;
if ( OnMouseCommon( event, &x, &y ) ) if ( OnMouseCommon( event, &x, &y ) )
{ {
HandleMouseClick(x,y,event); if ( !HandleMouseClick(x, y, event) )
event.Skip();
}
else
{
event.Skip();
} }
event.Skip();
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -5289,7 +5306,9 @@ void wxPropertyGrid::OnMouseDoubleClick( wxMouseEvent &event )
int x, y; int x, y;
CalcUnscrolledPosition( event.m_x, event.m_y, &x, &y ); CalcUnscrolledPosition( event.m_x, event.m_y, &x, &y );
HandleMouseDoubleClick(x,y,event); HandleMouseDoubleClick(x,y,event);
event.Skip();
// Do not Skip() event here - OnMouseClick() call above
// should have already taken care of it.
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -5311,9 +5330,13 @@ void wxPropertyGrid::OnMouseUp( wxMouseEvent &event )
int x, y; int x, y;
if ( OnMouseCommon( event, &x, &y ) ) if ( OnMouseCommon( event, &x, &y ) )
{ {
HandleMouseUp(x,y,event); if ( !HandleMouseUp(x, y, event) )
event.Skip();
}
else
{
event.Skip();
} }
event.Skip();
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------