X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4c51a665c649f7579fb39e62070cef4f66b3210d..e733c4ce1e24cf7e4b0b0d8362fc59aaa7a7641c:/src/propgrid/propgrid.cpp diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 2b2877276d..63b5099321 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -4,7 +4,6 @@ // Author: Jaakko Salli // Modified by: // Created: 2004-09-25 -// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -159,8 +158,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxPGGlobalVarsClassManager, wxModule) void wxPGInitResourceModule() { wxModule* module = new wxPGGlobalVarsClassManager; - module->Init(); wxModule::RegisterModule(module); + wxModule::InitializeModules(); } wxPGGlobalVarsClass* wxPGGlobalVars = NULL; @@ -348,6 +347,7 @@ void wxPropertyGrid::Init1() m_eventObject = this; m_curFocused = NULL; m_processedEvent = NULL; + m_tlp = NULL; m_sortFunction = NULL; m_inDoPropertyChanged = false; m_inCommitChangesFromEditor = false; @@ -375,9 +375,7 @@ void wxPropertyGrid::Init1() m_coloursCustomized = 0; m_frozen = 0; -#if wxPG_DOUBLE_BUFFER m_doubleBuffer = NULL; -#endif #ifndef wxPG_ICON_WIDTH m_expandbmp = NULL; @@ -467,7 +465,6 @@ void wxPropertyGrid::Init2() SetBackgroundStyle( wxBG_STYLE_CUSTOM ); // Hook the top-level parent - m_tlp = NULL; m_tlpClosed = NULL; m_tlpClosedTime = 0; @@ -544,10 +541,8 @@ wxPropertyGrid::~wxPropertyGrid() wxS("Close(false).)") ); } -#if wxPG_DOUBLE_BUFFER if ( m_doubleBuffer ) delete m_doubleBuffer; -#endif if ( m_iFlags & wxPG_FL_CREATEDSTATE ) delete m_pState; @@ -672,9 +667,7 @@ void wxPropertyGrid::Thaw() { wxControl::Thaw(); RecalculateVirtualSize(); - #if wxPG_REFRESH_CONTROLS_AFTER_REPAINT Refresh(); - #endif // Force property re-selection // NB: We must copy the selection. @@ -1000,7 +993,7 @@ void wxPropertyGrid::DoBeginLabelEdit( unsigned int colIndex, colIndex); wxWindowID id = tc->GetId(); - tc->Connect(id, wxEVT_COMMAND_TEXT_ENTER, + tc->Connect(id, wxEVT_TEXT_ENTER, wxCommandEventHandler(wxPropertyGrid::OnLabelEditorEnterPress), NULL, this); tc->Connect(id, wxEVT_KEY_DOWN, @@ -1127,9 +1120,7 @@ void wxPropertyGrid::SetExtraStyle( long exStyle ) } else { - #if wxPG_DOUBLE_BUFFER wxDELETE(m_doubleBuffer); - #endif } } @@ -1965,7 +1956,6 @@ void wxPropertyGrid::DrawItems( wxDC& dc, wxDC* dcPtr = &dc; bool isBuffered = false; - #if wxPG_DOUBLE_BUFFER wxMemoryDC* bufferDC = NULL; if ( !(GetExtraStyle() & wxPG_EX_NATIVE_DOUBLE_BUFFERING) ) @@ -1986,7 +1976,6 @@ void wxPropertyGrid::DrawItems( wxDC& dc, isBuffered = true; } } - #endif if ( dcPtr ) { @@ -2005,7 +1994,6 @@ void wxPropertyGrid::DrawItems( wxDC& dc, } } - #if wxPG_DOUBLE_BUFFER if ( bufferDC ) { dc.Blit( drawRect.x, drawRect.y, drawRect.width, @@ -2013,7 +2001,6 @@ void wxPropertyGrid::DrawItems( wxDC& dc, bufferDC, 0, 0, wxCOPY ); delete bufferDC; } - #endif } else { @@ -2085,10 +2072,11 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, int xRelMod = 0; // - // With wxPG_DOUBLE_BUFFER, do double buffering + // For now, do some manual calculation for double buffering // - buffer's y = 0, so align itemsRect and coordinates to that // -#if wxPG_DOUBLE_BUFFER + // TODO: In future use wxAutoBufferedPaintDC (for example) + // int yRelMod = 0; wxRect cr2; @@ -2107,9 +2095,6 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, firstItemTopY -= yRelMod; lastItemBottomY -= yRelMod; } -#else - wxUnusedVar(isBuffered); -#endif int x = m_marginWidth - xRelMod; @@ -2151,10 +2136,6 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, const wxPropertyGridPageState* state = m_pState; const wxArrayInt& colWidths = state->m_colWidths; -#if wxPG_REFRESH_CONTROLS_AFTER_REPAINT - bool wasSelectedPainted = false; -#endif - // TODO: Only render columns that are within clipping region. dc.SetFont(normalFont); @@ -2282,11 +2263,6 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, } else { -#if wxPG_REFRESH_CONTROLS_AFTER_REPAINT - if ( p == firstSelected ) - wasSelectedPainted = true; -#endif - renderFlags |= wxPGCellRenderer::Selected; if ( !p->IsCategory() ) @@ -2523,18 +2499,6 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, y += rowHeight; } - // Refresh editor controls (seems not needed on msw) - // NOTE: This code is mandatory for GTK! -#if wxPG_REFRESH_CONTROLS_AFTER_REPAINT - if ( wasSelectedPainted ) - { - if ( m_wndEditor ) - m_wndEditor->Refresh(); - if ( m_wndEditor2 ) - m_wndEditor2->Refresh(); - } -#endif - return y; } @@ -2612,7 +2576,7 @@ void wxPropertyGrid::DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 ) void wxPropertyGrid::RefreshProperty( wxPGProperty* p ) { - if ( m_pState->DoIsPropertySelected(p) ) + if ( m_pState->DoIsPropertySelected(p) || p->IsChildSelected(true) ) { // NB: We must copy the selection. wxArrayPGProperty selection = m_pState->m_selection; @@ -2674,7 +2638,7 @@ void wxPropertyGrid::Refresh( bool WXUNUSED(eraseBackground), wxWindow::Refresh(false, rect); -#if wxPG_REFRESH_CONTROLS_AFTER_REPAINT +#if wxPG_REFRESH_CONTROLS // I think this really helps only GTK+1.2 if ( m_wndEditor ) m_wndEditor->Refresh(); if ( m_wndEditor2 ) m_wndEditor2->Refresh(); @@ -3093,7 +3057,7 @@ bool wxPropertyGrid::PerformValidation( wxPGProperty* p, wxVariant& pendingValue if ( changedProperty == GetSelection() ) { wxWindow* editor = GetEditorControl(); - wxASSERT( editor->IsKindOf(CLASSINFO(wxTextCtrl)) ); + wxASSERT( wxDynamicCast(editor, wxTextCtrl) ); evtChangingValue = wxStaticCast(editor, wxTextCtrl)->GetValue(); } else @@ -3148,7 +3112,7 @@ bool wxPropertyGrid::PerformValidation( wxPGProperty* p, wxVariant& pendingValue wxStatusBar* wxPropertyGrid::GetStatusBar() { wxWindow* topWnd = ::wxGetTopLevelParent(this); - if ( topWnd && topWnd->IsKindOf(CLASSINFO(wxFrame)) ) + if ( wxDynamicCast(topWnd, wxFrame) ) { wxFrame* pFrame = wxStaticCast(topWnd, wxFrame); if ( pFrame ) @@ -3231,7 +3195,7 @@ bool wxPropertyGrid::OnValidationFailure( wxPGProperty* property, // // For non-wxTextCtrl editors, we do need to revert the value - if ( !editor->IsKindOf(CLASSINFO(wxTextCtrl)) && + if ( !wxDynamicCast(editor, wxTextCtrl) && property == GetSelection() ) { property->GetEditorClass()->UpdateControl(property, editor); @@ -3441,7 +3405,7 @@ bool wxPropertyGrid::DoPropertyChanged( wxPGProperty* p, unsigned int selFlags ) } else { -#if wxPG_REFRESH_CONTROLS_AFTER_REPAINT +#if wxPG_REFRESH_CONTROLS if ( m_wndEditor ) m_wndEditor->Refresh(); if ( m_wndEditor2 ) m_wndEditor2->Refresh(); #endif @@ -3595,9 +3559,9 @@ bool wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) // // Filter out excess wxTextCtrl modified events - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED && wnd ) + if ( event.GetEventType() == wxEVT_TEXT && wnd ) { - if ( wnd->IsKindOf(CLASSINFO(wxTextCtrl)) ) + if ( wxDynamicCast(wnd, wxTextCtrl) ) { wxTextCtrl* tc = (wxTextCtrl*) wnd; @@ -3606,8 +3570,14 @@ bool wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) return true; m_prevTcValue = newTcValue; } - else if ( wnd->IsKindOf(CLASSINFO(wxComboCtrl)) ) + else if ( wxDynamicCast(wnd, wxComboCtrl) ) { + // In some cases we might stumble unintentionally on + // wxComboCtrl's embedded wxTextCtrl's events. Let's + // avoid them. + if ( wxDynamicCast(editorWnd, wxTextCtrl) ) + return false; + wxComboCtrl* cc = (wxComboCtrl*) wnd; wxString newTcValue = cc->GetTextCtrl()->GetValue(); @@ -3625,7 +3595,7 @@ bool wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) // // Try common button handling - if ( m_wndEditor2 && event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ) + if ( m_wndEditor2 && event.GetEventType() == wxEVT_BUTTON ) { wxPGEditorDialogAdapter* adapter = selected->GetEditorDialog(); @@ -3633,7 +3603,7 @@ bool wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) { buttonWasHandled = true; // Store as res2, as previously (and still currently alternatively) - // dialogs can be shown by handling wxEVT_COMMAND_BUTTON_CLICKED + // dialogs can be shown by handling wxEVT_BUTTON // in wxPGProperty::OnEvent(). adapter->ShowDialog( this, selected ); delete adapter; @@ -3705,7 +3675,7 @@ bool wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) // Regardless of editor type, unfocus editor on // text-editing related enter press. - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER ) + if ( event.GetEventType() == wxEVT_TEXT_ENTER ) { SetFocusOnCanvas(); } @@ -3716,16 +3686,16 @@ bool wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) // Regardless of editor type, unfocus editor on // text-editing related enter press. - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER ) + if ( event.GetEventType() == wxEVT_TEXT_ENTER ) { SetFocusOnCanvas(); } // Let unhandled button click events go to the parent - if ( !buttonWasHandled && event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ) + if ( !buttonWasHandled && event.GetEventType() == wxEVT_BUTTON ) { result = true; - wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED,GetId()); + wxCommandEvent evt(wxEVT_BUTTON,GetId()); GetEventHandler()->AddPendingEvent(evt); } } @@ -3920,7 +3890,7 @@ private: // NB: On wxMSW, a wxTextCtrl with wxTE_PROCESS_ENTER // may beep annoyingly if that event is skipped // and passed to parent event handler. - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER ) + if ( event.GetEventType() == wxEVT_TEXT_ENTER ) return true; return wxEvtHandler::ProcessEvent(event); @@ -4586,7 +4556,6 @@ void wxPropertyGrid::RecalculateVirtualSize( int forceXPos ) if ( !HasVirtualWidth() ) { m_pState->SetVirtualWidth(width); - x = width; } m_width = width; @@ -4613,7 +4582,6 @@ void wxPropertyGrid::OnResize( wxSizeEvent& event ) m_width = width; m_height = height; -#if wxPG_DOUBLE_BUFFER if ( !(GetExtraStyle() & wxPG_EX_NATIVE_DOUBLE_BUFFERING) ) { int dblh = (m_lineHeight*2); @@ -4641,8 +4609,6 @@ void wxPropertyGrid::OnResize( wxSizeEvent& event ) } } -#endif - m_pState->OnClientWidthChange( width, event.GetSize().x - m_ncWidth, true ); m_ncWidth = event.GetSize().x; @@ -4885,7 +4851,7 @@ bool wxPropertyGrid::HandleMouseClick( int x, unsigned int y, wxMouseEvent &even m_draggedSplitter = splitterHit; m_dragOffset = splitterHitOffset; - #if wxPG_REFRESH_CONTROLS_AFTER_REPAINT + #if wxPG_REFRESH_CONTROLS // Fixes button disappearance bug if ( m_wndEditor2 ) m_wndEditor2->Show ( false ); @@ -5197,7 +5163,7 @@ bool wxPropertyGrid::HandleMouseUp( int x, unsigned int WXUNUSED(y), int splitterHitOffset; state->HitTestH( x, &splitterHit, &splitterHitOffset ); - // No event type check - basicly calling this method should + // No event type check - basically calling this method should // just stop dragging. // Left up after dragged? if ( m_dragStatus >= 1 ) @@ -5250,7 +5216,7 @@ bool wxPropertyGrid::HandleMouseUp( int x, unsigned int WXUNUSED(y), m_wndEditor->Show ( true ); } - #if wxPG_REFRESH_CONTROLS_AFTER_REPAINT + #if wxPG_REFRESH_CONTROLS // Fixes button disappearance bug if ( m_wndEditor2 ) m_wndEditor2->Show ( true ); @@ -5276,7 +5242,7 @@ bool wxPropertyGrid::OnMouseCommon( wxMouseEvent& event, int* px, int* py ) // Hide popup on clicks if ( event.GetEventType() != wxEVT_MOTION ) - if ( wnd && wnd->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)) ) + if ( wxDynamicCast(wnd, wxOwnerDrawnComboBox) ) { ((wxOwnerDrawnComboBox*)wnd)->HidePopup(); } @@ -5585,12 +5551,14 @@ void wxPropertyGrid::HandleKeyEvent( wxKeyEvent &event, bool fromChild ) if ( keycode == WXK_TAB ) { +#if defined(__WXGTK__) wxWindow* mainControl; if ( HasInternalFlag(wxPG_FL_IN_MANAGER) ) mainControl = GetParent(); else mainControl = this; +#endif if ( !event.ShiftDown() ) { @@ -5805,7 +5773,7 @@ bool wxPropertyGrid::ButtonTriggerKeyTest( int action, wxKeyEvent& event ) if ( action == wxPG_ACTION_PRESS_BUTTON && m_wndEditor2 ) { - wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED, m_wndEditor2->GetId()); + wxCommandEvent evt(wxEVT_BUTTON, m_wndEditor2->GetId()); GetEventHandler()->AddPendingEvent(evt); return true; } @@ -6236,6 +6204,7 @@ void wxPropertyGridEvent::Init() m_column = 1; m_canVeto = false; m_wasVetoed = false; + m_pg = NULL; } // ----------------------------------------------------------------------- @@ -6373,7 +6342,7 @@ wxPGProperty* wxPropertyGridPopulator::Add( const wxString& propClass, return NULL; } - if ( !classInfo || !classInfo->IsKindOf(CLASSINFO(wxPGProperty)) ) + if ( !classInfo || !classInfo->IsKindOf(wxCLASSINFO(wxPGProperty)) ) { ProcessError(wxString::Format(wxT("'%s' is not valid property class"),propClass.c_str())); return NULL;