From: Jaakko Salli Date: Fri, 24 Sep 2010 14:47:20 +0000 (+0000) Subject: Have wxPropertyGrid inherit from wxControl and wxScrollHelper instead of wxScrolledWi... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2e2e62def19db03f418e3d432d2ec77fc9ba6e66 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 --- diff --git a/include/wx/propgrid/propgrid.h b/include/wx/propgrid/propgrid.h index 2f8eeecc67..b133d0b033 100644 --- a/include/wx/propgrid/propgrid.h +++ b/include/wx/propgrid/propgrid.h @@ -712,8 +712,9 @@ enum wxPG_SET_SPLITTER_POSITION_SPLITTER_FLAGS @library{wxpropgrid} @category{propgrid} */ -class WXDLLIMPEXP_PROPGRID - wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface +class WXDLLIMPEXP_PROPGRID wxPropertyGrid : public wxControl, + public wxScrollHelper, + public wxPropertyGridInterface { friend class wxPropertyGridEvent; friend class wxPropertyGridPageState; @@ -735,7 +736,7 @@ public: #endif /** 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 */ @@ -1039,7 +1040,7 @@ public: @param pt Coordinates in the virtual grid space. You may need to use - wxScrolledWindow::CalcScrolledPosition() for translating + wxScrolled::CalcScrolledPosition() for translating wxPropertyGrid client coordinates into something this member function can use. */ @@ -1838,12 +1839,7 @@ protected: /** Current cursor id. */ int m_curcursor; - /** - 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) - */ + // Caption font. Same as normal font plus bold style. wxFont m_captionFont; int m_fontHeight; // Height of the font. @@ -2110,7 +2106,7 @@ protected: void CorrectEditorWidgetPosY(); int DoDrawItems( wxDC& dc, - const wxRect* drawRect, + const wxRect* itemsRect, bool isBuffered ) const; /** Draws an expand/collapse (ie. +/-) button. @@ -2122,7 +2118,7 @@ protected: void DrawItems( wxDC& dc, unsigned int topItemY, unsigned int bottomItemY, - const wxRect* drawRect = NULL ); + const wxRect* itemsRect = NULL ); // Translate wxKeyEvent to wxPG_ACTION_XXX int KeyEventToActions(wxKeyEvent &event, int* pSecond) const; diff --git a/include/wx/propgrid/propgridpagestate.h b/include/wx/propgrid/propgridpagestate.h index a2d91f552a..88ca0eb7f4 100644 --- a/include/wx/propgrid/propgridpagestate.h +++ b/include/wx/propgrid/propgridpagestate.h @@ -590,7 +590,7 @@ public: @param pt Logical coordinates in the virtual grid space. Use - wxScrolledWindow::CalcUnscrolledPosition() if you need to + wxScrolled::CalcUnscrolledPosition() if you need to translate a scrolled position into a logical one. */ wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const; diff --git a/interface/wx/propgrid/propgrid.h b/interface/wx/propgrid/propgrid.h index ec03f29e79..c88cf3efcc 100644 --- a/interface/wx/propgrid/propgrid.h +++ b/interface/wx/propgrid/propgrid.h @@ -439,7 +439,9 @@ typedef int (*wxPGSortCallback)(wxPropertyGrid* propGrid, @category{propgrid} @appearance{propertygrid.png} */ -class wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface +class wxPropertyGrid : public wxControl, + public wxScrollHelper, + public wxPropertyGridInterface { public: /** @@ -450,7 +452,7 @@ public: /** 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. */ @@ -810,7 +812,7 @@ public: @param pt Coordinates in the virtual grid space. You may need to use - wxScrolledWindow::CalcScrolledPosition() for translating + wxScrolled::CalcScrolledPosition() for translating wxPropertyGrid client coordinates into something this member function can use. */ diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 7527e69265..31b518e95c 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -246,9 +246,9 @@ void wxPropertyGridInitGlobalsIfNeeded() // 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_PAINT(wxPropertyGrid::OnPaint) EVT_SIZE(wxPropertyGrid::OnResize) @@ -271,7 +271,7 @@ END_EVENT_TABLE() // ----------------------------------------------------------------------- wxPropertyGrid::wxPropertyGrid() - : wxScrolledWindow() + : wxControl(), wxScrollHelper(this) { Init1(); } @@ -284,7 +284,7 @@ wxPropertyGrid::wxPropertyGrid( wxWindow *parent, const wxSize& size, long style, const wxString& name ) - : wxScrolledWindow() + : wxControl(), wxScrollHelper(this) { Init1(); Create(parent,id,pos,size,style,name); @@ -311,7 +311,10 @@ bool wxPropertyGrid::Create( wxWindow *parent, style &= ~(wxTAB_TRAVERSAL); style |= wxWANTS_CHARS; - wxScrolledWindow::Create(parent,id,pos,size,style,name); + wxControl::Create(parent, id, pos, size, + style | wxScrolledWindowStyle, + wxDefaultValidator, + name); Init2(); @@ -470,10 +473,6 @@ void wxPropertyGrid::Init2() 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_ncWidth = wndsize.GetWidth(); @@ -572,7 +571,7 @@ bool wxPropertyGrid::Destroy() if ( m_iFlags & wxPG_FL_MOUSE_CAPTURED ) ReleaseMouse(); - return wxScrolledWindow::Destroy(); + return wxControl::Destroy(); } // ----------------------------------------------------------------------- @@ -631,12 +630,12 @@ void wxPropertyGrid::SetWindowStyleFlag( long style ) // // Tooltips disabled // - wxScrolledWindow::SetToolTip( NULL ); + SetToolTip( NULL ); } #endif } - wxScrolledWindow::SetWindowStyleFlag ( style ); + wxControl::SetWindowStyleFlag ( style ); if ( m_iFlags & wxPG_FL_INITIALIZED ) { @@ -654,7 +653,7 @@ void wxPropertyGrid::Freeze() { if ( !m_frozen ) { - wxScrolledWindow::Freeze(); + wxControl::Freeze(); } m_frozen++; } @@ -667,7 +666,7 @@ void wxPropertyGrid::Thaw() if ( !m_frozen ) { - wxScrolledWindow::Thaw(); + wxControl::Thaw(); RecalculateVirtualSize(); #if wxPG_REFRESH_CONTROLS_AFTER_REPAINT Refresh(); @@ -1130,7 +1129,7 @@ void wxPropertyGrid::SetExtraStyle( long exStyle ) } } - wxScrolledWindow::SetExtraStyle( exStyle ); + wxControl::SetExtraStyle( exStyle ); if ( exStyle & wxPG_EX_INIT_NOCAT ) m_pState->InitNonCatMode(); @@ -1236,7 +1235,7 @@ bool wxPropertyGrid::Reparent( wxWindowBase *newParent ) { OnTLPChanging((wxWindow*)newParent); - bool res = wxScrolledWindow::Reparent(newParent); + bool res = wxControl::Reparent(newParent); return res; } @@ -1249,7 +1248,7 @@ void wxPropertyGrid::CalculateFontAndBitmapStuff( int vspacing ) { int x = 0, y = 0; - m_captionFont = wxScrolledWindow::GetFont(); + m_captionFont = wxControl::GetFont(); GetTextExtent(wxS("jG"), &x, &y, 0, 0, &m_captionFont); m_subgroup_extramargin = x + (x/2); @@ -1444,7 +1443,7 @@ bool wxPropertyGrid::SetFont( const wxFont& font ) // Must disable active editor. 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 { CalculateFontAndBitmapStuff( m_vspacing ); @@ -1830,6 +1829,9 @@ void wxPropertyGrid::OnPaint( wxPaintEvent& WXUNUSED(event) ) r.x = 0; r.width = GetClientSize().x; + r.y = vy; + r.height = GetClientSize().y; + // Repaint this rectangle 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, unsigned int topItemY, unsigned int bottomItemY, - const wxRect* drawRect ) + const wxRect* itemsRect ) { if ( m_frozen || m_height < 1 || @@ -1929,15 +1931,25 @@ void wxPropertyGrid::DrawItems( wxDC& dc, m_pState->EnsureVirtualHeight(); - wxRect tempDrawRect; - if ( !drawRect ) + wxRect tempItemsRect; + if ( !itemsRect ) { - tempDrawRect = wxRect(0, topItemY, - m_pState->m_width, - bottomItemY); - drawRect = &tempDrawRect; + tempItemsRect = wxRect(0, topItemY, + m_pState->m_width, + bottomItemY); + 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 if ( m_pState->m_itemsAdded ) PrepareAfterItemsAdded(); @@ -1955,7 +1967,7 @@ void wxPropertyGrid::DrawItems( wxDC& dc, { if ( !m_doubleBuffer ) { - paintFinishY = drawRect->y; + paintFinishY = itemsRect->y; dcPtr = NULL; } else @@ -1973,28 +1985,26 @@ void wxPropertyGrid::DrawItems( wxDC& dc, if ( dcPtr ) { - dc.SetClippingRegion( *drawRect ); - paintFinishY = DoDrawItems( *dcPtr, drawRect, isBuffered ); - int drawBottomY = drawRect->y + drawRect->height; + paintFinishY = DoDrawItems( *dcPtr, itemsRect, isBuffered ); + int drawBottomY = itemsRect->y + itemsRect->height; // Clear area beyond last painted property if ( paintFinishY < drawBottomY ) { + wxLogDebug("%i", paintFinishY); dcPtr->SetPen(m_colEmptySpace); dcPtr->SetBrush(m_colEmptySpace); dcPtr->DrawRectangle(0, paintFinishY, m_width, drawBottomY ); } - - dc.DestroyClippingRegion(); } #if wxPG_DOUBLE_BUFFER if ( bufferDC ) { - dc.Blit( drawRect->x, drawRect->y, drawRect->width, - drawRect->height, + dc.Blit( drawRect.x, drawRect.y, drawRect.width, + drawRect.height, bufferDC, 0, 0, wxCOPY ); delete bufferDC; } @@ -2005,29 +2015,29 @@ void wxPropertyGrid::DrawItems( wxDC& dc, // Just clear the area dc.SetPen(m_colEmptySpace); dc.SetBrush(m_colEmptySpace); - dc.DrawRectangle(*drawRect); + dc.DrawRectangle(drawRect); } } // ----------------------------------------------------------------------- int wxPropertyGrid::DoDrawItems( wxDC& dc, - const wxRect* drawRect, + const wxRect* itemsRect, bool isBuffered ) const { const wxPGProperty* firstItem; const wxPGProperty* lastItem; - firstItem = DoGetItemAtY(drawRect->y); - lastItem = DoGetItemAtY(drawRect->y+drawRect->height-1); + firstItem = DoGetItemAtY(itemsRect->y); + lastItem = DoGetItemAtY(itemsRect->y+itemsRect->height-1); if ( !lastItem ) lastItem = GetLastItem( wxPG_ITERATE_VISIBLE ); 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" ); wxASSERT( m_pState->m_properties->GetChildCount() ); @@ -2036,8 +2046,8 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, int firstItemTopY; int lastItemBottomY; - firstItemTopY = drawRect->y; - lastItemBottomY = drawRect->y + drawRect->height; + firstItemTopY = itemsRect->y; + lastItemBottomY = itemsRect->y + itemsRect->height; // Align y coordinates to item boundaries firstItemTopY -= firstItemTopY % lh; @@ -2047,20 +2057,20 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, // Entire range outside scrolled, visible area? if ( firstItemTopY >= (int)m_pState->GetVirtualHeight() || lastItemBottomY <= 0 ) - return drawRect->y; + return itemsRect->y; wxCHECK_MSG( firstItemTopY < lastItemBottomY, - drawRect->y, + itemsRect->y, "invalid y values" ); /* wxLogDebug(" -> DoDrawItems ( \"%s\" -> \"%s\" - "height=%i (ch=%i), drawRect = 0x%lX )", + "height=%i (ch=%i), itemsRect = 0x%lX )", firstItem->GetLabel().c_str(), lastItem->GetLabel().c_str(), (int)(lastItemBottomY - firstItemTopY), (int)m_height, - (unsigned long)drawRect ); + (unsigned long)&itemsRect ); */ wxRect r; @@ -2071,7 +2081,7 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, // // 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 int yRelMod = 0; @@ -2080,15 +2090,15 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, if ( isBuffered ) { - xRelMod = drawRect->x; - yRelMod = drawRect->y; + xRelMod = itemsRect->x; + yRelMod = itemsRect->y; // - // drawRect conversion - cr2 = *drawRect; + // itemsRect conversion + cr2 = *itemsRect; cr2.x -= xRelMod; cr2.y -= yRelMod; - drawRect = &cr2; + itemsRect = &cr2; firstItemTopY -= yRelMod; lastItemBottomY -= yRelMod; } @@ -4651,7 +4661,7 @@ void wxPropertyGrid::SetVirtualWidth( int width ) void wxPropertyGrid::SetFocusOnCanvas() { - SetFocusIgnoringChildren(); + SetFocus(); m_editorFocused = 0; } @@ -4783,7 +4793,10 @@ bool wxPropertyGrid::HandleMouseClick( int x, unsigned int y, wxMouseEvent &even 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 { @@ -5264,9 +5277,13 @@ void wxPropertyGrid::OnMouseClick( wxMouseEvent &event ) int 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; CalcUnscrolledPosition( event.m_x, event.m_y, &x, &y ); 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; if ( OnMouseCommon( event, &x, &y ) ) { - HandleMouseUp(x,y,event); + if ( !HandleMouseUp(x, y, event) ) + event.Skip(); + } + else + { + event.Skip(); } - event.Skip(); } // -----------------------------------------------------------------------