]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/propgrid.cpp
Don't use wxDC in header
[wxWidgets.git] / src / propgrid / propgrid.cpp
index 22918ba5bab30a590c696e7e3d46d2966884be6c..7c7788b5a652cb104081cfd40d090242911fc9d4 100644 (file)
@@ -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;
 }
 
@@ -246,9 +250,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 +275,7 @@ END_EVENT_TABLE()
 // -----------------------------------------------------------------------
 
 wxPropertyGrid::wxPropertyGrid()
-    : wxScrolledWindow()
+    : wxControl(), wxScrollHelper(this)
 {
     Init1();
 }
@@ -284,7 +288,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 +315,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 +477,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 +575,7 @@ bool wxPropertyGrid::Destroy()
     if ( m_iFlags & wxPG_FL_MOUSE_CAPTURED )
         ReleaseMouse();
 
-    return wxScrolledWindow::Destroy();
+    return wxControl::Destroy();
 }
 
 // -----------------------------------------------------------------------
@@ -631,12 +634,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 +657,7 @@ void wxPropertyGrid::Freeze()
 {
     if ( !m_frozen )
     {
-        wxScrolledWindow::Freeze();
+        wxControl::Freeze();
     }
     m_frozen++;
 }
@@ -667,7 +670,7 @@ void wxPropertyGrid::Thaw()
 
     if ( !m_frozen )
     {
-        wxScrolledWindow::Thaw();
+        wxControl::Thaw();
         RecalculateVirtualSize();
     #if wxPG_REFRESH_CONTROLS_AFTER_REPAINT
         Refresh();
@@ -1130,7 +1133,7 @@ void wxPropertyGrid::SetExtraStyle( long exStyle )
         }
     }
 
-    wxScrolledWindow::SetExtraStyle( exStyle );
+    wxControl::SetExtraStyle( exStyle );
 
     if ( exStyle & wxPG_EX_INIT_NOCAT )
         m_pState->InitNonCatMode();
@@ -1236,7 +1239,7 @@ bool wxPropertyGrid::Reparent( wxWindowBase *newParent )
 {
     OnTLPChanging((wxWindow*)newParent);
 
-    bool res = wxScrolledWindow::Reparent(newParent);
+    bool res = wxControl::Reparent(newParent);
 
     return res;
 }
@@ -1249,7 +1252,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 +1447,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 +1833,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 +1925,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 +1935,26 @@ 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;
+
+    // itemRect is in virtual grid space
+    wxRect drawRect(itemsRect->x - vx,
+                    itemsRect->y - vy,
+                    itemsRect->width,
+                    itemsRect->height);
+
     // items added check
     if ( m_pState->m_itemsAdded ) PrepareAfterItemsAdded();
 
@@ -1955,7 +1972,7 @@ void wxPropertyGrid::DrawItems( wxDC& dc,
         {
             if ( !m_doubleBuffer )
             {
-                paintFinishY = drawRect->y;
+                paintFinishY = itemsRect->y;
                 dcPtr = NULL;
             }
             else
@@ -1973,9 +1990,9 @@ void wxPropertyGrid::DrawItems( wxDC& dc,
 
         if ( dcPtr )
         {
-            dc.SetClippingRegion( *drawRect );
-            paintFinishY = DoDrawItems( *dcPtr, drawRect, isBuffered );
-            int drawBottomY = drawRect->y + drawRect->height;
+            // paintFinishY and drawBottomY are in buffer/physical space
+            paintFinishY = DoDrawItems( *dcPtr, itemsRect, isBuffered );
+            int drawBottomY = itemsRect->y + itemsRect->height - vy;
 
             // Clear area beyond last painted property
             if ( paintFinishY < drawBottomY )
@@ -1986,15 +2003,13 @@ void wxPropertyGrid::DrawItems( wxDC& dc,
                                      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 +2020,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 +2051,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 +2062,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 +2086,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 +2095,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;
     }
@@ -2539,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;
@@ -4651,7 +4666,7 @@ void wxPropertyGrid::SetVirtualWidth( int width )
 
 void wxPropertyGrid::SetFocusOnCanvas()
 {
-    SetFocusIgnoringChildren();
+    SetFocus();
     m_editorFocused = 0;
 }
 
@@ -4783,7 +4798,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
             {
@@ -4922,28 +4940,6 @@ bool wxPropertyGrid::HandleMouseDoubleClick( int WXUNUSED(x),
 
 // -----------------------------------------------------------------------
 
-#if wxPG_SUPPORT_TOOLTIPS
-
-void wxPropertyGrid::SetToolTip( const wxString& tipString )
-{
-    if ( tipString.length() )
-    {
-        wxScrolledWindow::SetToolTip(tipString);
-    }
-    else
-    {
-    #if wxPG_ALLOW_EMPTY_TOOLTIPS
-        wxScrolledWindow::SetToolTip( m_emptyString );
-    #else
-        wxScrolledWindow::SetToolTip( NULL );
-    #endif
-    }
-}
-
-#endif // #if wxPG_SUPPORT_TOOLTIPS
-
-// -----------------------------------------------------------------------
-
 // Return false if should be skipped
 bool wxPropertyGrid::HandleMouseMove( int x, unsigned int y,
                                       wxMouseEvent &event )
@@ -5033,8 +5029,6 @@ bool wxPropertyGrid::HandleMouseMove( int x, unsigned int y,
         //
         if ( m_windowStyle & wxPG_TOOLTIPS )
         {
-            wxToolTip* tooltip = GetToolTip();
-
             if ( m_propHover != prevHover || prevSide != m_mouseSide )
             {
                 if ( m_propHover && !m_propHover->IsCategory() )
@@ -5074,34 +5068,18 @@ bool wxPropertyGrid::HandleMouseMove( int x, unsigned int y,
                             int tw, th;
                             GetTextExtent( tipString, &tw, &th, 0, 0 );
                             if ( tw > space )
-                            {
                                 SetToolTip( tipString );
-                            }
                         }
                         else
                         {
-                            if ( tooltip )
-                            {
-                            #if wxPG_ALLOW_EMPTY_TOOLTIPS
-                                SetToolTip( m_emptyString );
-                            #else
-                                wxScrolledWindow::SetToolTip( NULL );
-                            #endif
-                            }
+                            SetToolTip( m_emptyString );
                         }
 
                     }
                 }
                 else
                 {
-                    if ( tooltip )
-                    {
-                    #if wxPG_ALLOW_EMPTY_TOOLTIPS
-                        SetToolTip( m_emptyString );
-                    #else
-                        wxScrolledWindow::SetToolTip( NULL );
-                    #endif
-                    }
+                    SetToolTip( m_emptyString );
                 }
             }
         }
@@ -5211,7 +5189,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 )
@@ -5304,9 +5282,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();
 }
 
 // -----------------------------------------------------------------------
@@ -5329,7 +5311,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.
 }
 
 // -----------------------------------------------------------------------
@@ -5351,9 +5335,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();
 }
 
 // -----------------------------------------------------------------------