X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb296a697d16d097db413bf19a383bd2902caa36..5eed855656b3996f4c0aa0a585a4820a2af6d628:/src/propgrid/propgrid.cpp diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 3840896e8f..fac6436c3b 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -235,6 +235,10 @@ wxPGGlobalVarsClass::~wxPGGlobalVarsClass() delete ((wxPGEditor*)vt_it->second); } + // Make sure the global pointers have been reset + wxASSERT(wxPG_EDITOR(TextCtrl) == NULL); + wxASSERT(wxPG_EDITOR(ChoiceAndButton) == NULL); + delete wxPGProperty::sm_wxPG_LABEL; } @@ -1945,6 +1949,7 @@ void wxPropertyGrid::DrawItems( wxDC& dc, vx *= wxPG_PIXELS_PER_UNIT; vy *= wxPG_PIXELS_PER_UNIT; + // itemRect is in virtual grid space wxRect drawRect(itemsRect->x - vx, itemsRect->y - vy, itemsRect->width, @@ -1985,8 +1990,9 @@ void wxPropertyGrid::DrawItems( wxDC& dc, if ( dcPtr ) { + // paintFinishY and drawBottomY are in buffer/physical space paintFinishY = DoDrawItems( *dcPtr, itemsRect, isBuffered ); - int drawBottomY = itemsRect->y + itemsRect->height; + int drawBottomY = itemsRect->y + itemsRect->height - vy; // Clear area beyond last painted property if ( paintFinishY < drawBottomY ) @@ -2548,7 +2554,7 @@ wxRect wxPropertyGrid::GetPropertyRect( const wxPGProperty* p1, const wxPGProper // // Return rect which encloses the given property range // (in logical grid coordinates) - // + // int visTop = p1->GetY(); int visBottom; @@ -3536,13 +3542,19 @@ bool wxPropertyGrid::DoEditorValidate() // ----------------------------------------------------------------------- -void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) +bool wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) { + // + // NB: We should return true if the event was recognized as + // a dedicated wxPropertyGrid event, and as such was + // either properly handled or ignored. + // + // It is possible that this handler receives event even before // the control has been properly initialized. Let's skip the // event handling in that case. if ( !m_pState ) - return; + return false; // Don't care about the event if it originated from the // 'label editor'. In this function we only care about the @@ -3550,7 +3562,7 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) if ( m_labelEditor && event.GetId() == m_labelEditor->GetId() ) { event.Skip(); - return; + return true; } wxPGProperty* selected = GetSelection(); @@ -3564,10 +3576,10 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) // similar is currently doing something (showing a // message box, for instance). m_processedEvent ) - return; + return true; if ( m_iFlags & wxPG_FL_IN_HANDLECUSTOMEDITOREVENT ) - return; + return true; wxVariant pendingValue(selected->GetValueRef()); wxWindow* wnd = GetEditorControl(); @@ -3591,7 +3603,7 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) wxString newTcValue = tc->GetValue(); if ( m_prevTcValue == newTcValue ) - return; + return true; m_prevTcValue = newTcValue; } else if ( wnd->IsKindOf(CLASSINFO(wxComboCtrl)) ) @@ -3600,7 +3612,7 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) wxString newTcValue = cc->GetTextCtrl()->GetValue(); if ( m_prevTcValue == newTcValue ) - return; + return true; m_prevTcValue = newTcValue; } } @@ -3609,6 +3621,7 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) bool validationFailure = false; bool buttonWasHandled = false; + bool result = false; // // Try common button handling @@ -3636,6 +3649,8 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) if ( editor->OnEvent( this, selected, editorWnd, event ) ) { + result = true; + // If changes, validate them if ( DoEditorValidate() ) { @@ -3709,12 +3724,15 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) // Let unhandled button click events go to the parent if ( !buttonWasHandled && event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ) { + result = true; wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED,GetId()); GetEventHandler()->AddPendingEvent(evt); } } ClearInternalFlag(wxPG_FL_IN_HANDLECUSTOMEDITOREVENT); + + return result; } // ----------------------------------------------------------------------- @@ -3890,6 +3908,14 @@ private: m_propGrid->HandleCustomEditorEvent(event); + // + // NB: We should return true if the event was recognized as + // a dedicated wxPropertyGrid event, and as such was + // either properly handled or ignored. + // + if ( m_propGrid->IsMainButtonEvent(event) ) + return true; + // // NB: On wxMSW, a wxTextCtrl with wxTE_PROCESS_ENTER // may beep annoyingly if that event is skipped @@ -4562,6 +4588,11 @@ void wxPropertyGrid::RecalculateVirtualSize( int forceXPos ) SetScrollbars( wxPG_PIXELS_PER_UNIT, wxPG_PIXELS_PER_UNIT, xAmount, yAmount, xPos, yPos, true ); + // This may be needed in addition to calling SetScrollbars() + // when class inherits from wxScrollHelper instead of + // actual wxScrolled. + AdjustScrollbars(); + // Must re-get size now GetClientSize(&width,&height); @@ -5183,7 +5214,7 @@ bool wxPropertyGrid::HandleMouseUp( int x, unsigned int WXUNUSED(y), // Disable splitter auto-centering (but only if moved any - // otherwise we end up disabling auto-center even after a // recentering double-click). - int posDiff = abs(m_startingSplitterX - + int posDiff = abs(m_startingSplitterX - GetSplitterPosition(m_draggedSplitter)); if ( posDiff > 1 ) @@ -5656,6 +5687,12 @@ void wxPropertyGrid::HandleKeyEvent( wxKeyEvent &event, bool fromChild ) wxPGProperty* p = selected; + if ( action == wxPG_ACTION_EDIT && !editorFocused ) + { + DoSelectProperty( p, wxPG_SEL_FOCUS ); + wasHandled = true; + } + // Travel and expand/collapse int selectDir = -2;