]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/grid.cpp
move Freeze() and Thaw() to wxWindowBase to ensure that they behave consistently...
[wxWidgets.git] / src / generic / grid.cpp
index 8fb7e5197b3b4bb1acc7cdaa169d1b424912a563..0fba2b382965da530300336bcfcb18a411ce62ff 100644 (file)
@@ -642,21 +642,27 @@ void wxGridCellTextEditor::Create(wxWindow* parent,
                                   wxWindowID id,
                                   wxEvtHandler* evtHandler)
 {
+    DoCreate(parent, id, evtHandler);
+}
+
+void wxGridCellTextEditor::DoCreate(wxWindow* parent,
+                                    wxWindowID id,
+                                    wxEvtHandler* evtHandler,
+                                    long style)
+{
+    style |= wxTE_PROCESS_ENTER |
+             wxTE_PROCESS_TAB |
+             wxTE_AUTO_SCROLL |
+             wxNO_BORDER;
+
     m_control = new wxTextCtrl(parent, id, wxEmptyString,
-                               wxDefaultPosition, wxDefaultSize
-#if defined(__WXMSW__)
-                               ,
-                               wxTE_PROCESS_ENTER |
-                               wxTE_PROCESS_TAB |
-                               wxTE_AUTO_SCROLL |
-                               wxNO_BORDER
-#endif
-                              );
+                               wxDefaultPosition, wxDefaultSize,
+                               style);
 
     // set max length allowed in the textctrl, if the parameter was set
-    if (m_maxChars != 0)
+    if ( m_maxChars != 0 )
     {
-        ((wxTextCtrl*)m_control)->SetMaxLength(m_maxChars);
+        Text()->SetMaxLength(m_maxChars);
     }
 
     wxGridCellEditor::Create(parent, id, evtHandler);
@@ -1514,10 +1520,12 @@ void wxGridCellChoiceEditor::Create(wxWindow* parent,
                                     wxWindowID id,
                                     wxEvtHandler* evtHandler)
 {
+    int style = wxBORDER_NONE;
+    if (!m_allowOthers)
+        style |= wxCB_READONLY;
     m_control = new wxComboBox(parent, id, wxEmptyString,
                                wxDefaultPosition, wxDefaultSize,
-                               m_choices,
-                               m_allowOthers ? 0 : wxCB_READONLY);
+                               m_choices, style );
 
     wxGridCellEditor::Create(parent, id, evtHandler);
 }
@@ -1552,8 +1560,9 @@ void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid)
     if (m_allowOthers)
     {
         Combo()->SetValue(m_startValue);
+        Combo()->SetInsertionPointEnd();
     }
-    else
+    else // the combobox is read-only
     {
         // find the right position, or default to the first if not found
         int pos = Combo()->FindString(m_startValue);
@@ -1562,7 +1571,6 @@ void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid)
         Combo()->SetSelection(pos);
     }
 
-    Combo()->SetInsertionPointEnd();
     Combo()->SetFocus();
 
     if (evtHandler)
@@ -2198,8 +2206,7 @@ wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid,
         wxSize size = checkbox->GetBestSize();
         wxCoord checkSize = size.y + 2 * wxGRID_CHECKMARK_MARGIN;
 
-        // FIXME wxGTK::wxCheckBox::GetBestSize() gives "wrong" result
-#if defined(__WXGTK__) || defined(__WXMOTIF__)
+#if defined(__WXMOTIF__)
         checkSize -= size.y / 2;
 #endif
 
@@ -2228,7 +2235,7 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid,
     if ( size.x >= minSize || size.y >= minSize )
     {
         // and even leave (at least) 1 pixel margin
-        size.x = size.y = minSize - 2;
+        size.x = size.y = minSize;
     }
 
     // draw a border around checkmark
@@ -2269,26 +2276,11 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid,
         value = wxGridCellBoolEditor::IsTrueValue(cellval);
     }
 
-    if ( value )
-    {
-        wxRect rectMark = rectBorder;
-
-#ifdef __WXMSW__
-        // MSW DrawCheckMark() is weird (and should probably be changed...)
-        rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN / 2);
-        rectMark.x++;
-        rectMark.y++;
-#else
-        rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN);
-#endif
-
-        dc.SetTextForeground(attr.GetTextColour());
-        dc.DrawCheckMark(rectMark);
-    }
-
-    dc.SetBrush(*wxTRANSPARENT_BRUSH);
-    dc.SetPen(wxPen(attr.GetTextColour(), 1, wxSOLID));
-    dc.DrawRectangle(rectBorder);
+    int flags = 0;
+    if (value)
+        flags |= wxCONTROL_CHECKED; 
+        
+    wxRendererNative::Get().DrawCheckBox( &grid, dc, rectBorder, flags );
 }
 
 // ----------------------------------------------------------------------------
@@ -2717,7 +2709,7 @@ int wxGridCellAttrData::FindIndex(int row, int col) const
 
 wxGridRowOrColAttrData::~wxGridRowOrColAttrData()
 {
-    size_t count = m_attrs.Count();
+    size_t count = m_attrs.GetCount();
     for ( size_t n = 0; n < count; n++ )
     {
         m_attrs[n]->DecRef();
@@ -2743,9 +2735,13 @@ void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol)
     int i = m_rowsOrCols.Index(rowOrCol);
     if ( i == wxNOT_FOUND )
     {
-        // add the attribute
-        m_rowsOrCols.Add(rowOrCol);
-        m_attrs.Add(attr);
+        if ( attr )
+        {
+            // add the attribute
+            m_rowsOrCols.Add(rowOrCol);
+            m_attrs.Add(attr);
+        }
+        // nothing to remove
     }
     else
     {
@@ -2958,7 +2954,7 @@ void wxGridCellAttrProvider::UpdateAttrCols( size_t pos, int numCols )
 
 wxGridTypeRegistry::~wxGridTypeRegistry()
 {
-    size_t count = m_typeinfo.Count();
+    size_t count = m_typeinfo.GetCount();
     for ( size_t i = 0; i < count; i++ )
         delete m_typeinfo[i];
 }
@@ -4213,6 +4209,7 @@ bool wxGrid::Create(wxWindow *parent, wxWindowID id,
 
     Create();
     SetInitialSize(size);
+    CalcDimensions();
 
     return true;
 }
@@ -4518,6 +4515,7 @@ void wxGrid::Init()
     m_dragRowOrCol = -1;
     m_isDragging = false;
     m_startDragPos = wxDefaultPosition;
+    m_nativeColumnLabels = false;
 
     m_waitForSlowClick = false;
 
@@ -6285,7 +6283,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
             if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL )
             {
                 if ( CanDragRowSize() && CanDragGridSize() )
-                    ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW);
+                    ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW, NULL, false);
             }
         }
         else if ( dragCol >= 0 )
@@ -6295,7 +6293,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
             if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL )
             {
                 if ( CanDragColSize() && CanDragGridSize() )
-                    ChangeCursorMode(WXGRID_CURSOR_RESIZE_COL);
+                    ChangeCursorMode(WXGRID_CURSOR_RESIZE_COL, NULL, false);
             }
         }
         else // Neither on a row or col edge
@@ -6945,8 +6943,11 @@ void wxGrid::Refresh(bool eraseb, const wxRect* rect)
 
 void wxGrid::OnSize(wxSizeEvent& WXUNUSED(event))
 {
-    // update our children window positions and scrollbars
-    CalcDimensions();
+    if (m_targetWindow != this) // check whether initialisation has been done
+    {
+        // update our children window positions and scrollbars
+        CalcDimensions();
+    }
 }
 
 void wxGrid::OnKeyDown( wxKeyEvent& event )
@@ -7202,7 +7203,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
         return;
     }
 
-#if !(defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS)
+#if !defined(__WXMAC__)
     wxClientDC dc( m_gridWin );
     PrepareDC( dc );
 #endif
@@ -7228,7 +7229,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
             // Otherwise refresh redraws the highlight!
             m_currentCellCoords = coords;
 
-#if defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS
+#if defined(__WXMAC__)
             m_gridWin->Refresh(true /*, & r */);
 #else
             DrawGridCellArea( dc, cells );
@@ -7240,7 +7241,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
     m_currentCellCoords = coords;
 
     wxGridCellAttr *attr = GetCellAttr( coords );
-#if !(defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS)
+#if !defined(__WXMAC__) 
     DrawCellHighlight( dc, attr );
 #endif
     attr->DecRef();
@@ -7813,7 +7814,6 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) )
     int rightCol = GetColPos( internalXToCol(right) );
     int bottomRow = internalYToRow(bottom);
 
-#if !defined(__WXMAC__) || wxMAC_USE_CORE_GRAPHICS
     wxRegion clippedcells(0, 0, cw, ch);
 
     int i, j, cell_rows, cell_cols;
@@ -7841,30 +7841,6 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) )
             }
         }
     }
-#else
-    wxRegion clippedcells( left, top, right - left, bottom - top );
-
-    int i, j, cell_rows, cell_cols;
-    wxRect rect;
-
-    for (j=topRow; j<=bottomRow; j++)
-    {
-        for (i=leftCol; i<=rightCol; i++)
-        {
-            GetCellSize( j, i, &cell_rows, &cell_cols );
-            if ((cell_rows > 1) || (cell_cols > 1))
-            {
-                rect = CellToRect(j, i);
-                clippedcells.Subtract(rect);
-            }
-            else if ((cell_rows < 0) || (cell_cols < 0))
-            {
-                rect = CellToRect(j + cell_rows, i + cell_cols);
-                clippedcells.Subtract(rect);
-            }
-        }
-    }
-#endif
 
     dc.SetClippingRegion( clippedcells );
 
@@ -7937,19 +7913,6 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row )
 
     wxRect rect;
 
-#if 0
-def __WXGTK20__
-    rect.SetX( 1 );
-    rect.SetY( GetRowTop(row) + 1 );
-    rect.SetWidth( m_rowLabelWidth - 2 );
-    rect.SetHeight( GetRowHeight(row) - 2 );
-
-    CalcScrolledPosition( 0, rect.y, NULL, &rect.y );
-
-    wxWindowDC *win_dc = (wxWindowDC*) &dc;
-
-    wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
-#else
     int rowTop = GetRowTop(row),
         rowBottom = GetRowBottom(row) - 1;
 
@@ -7961,7 +7924,6 @@ def __WXGTK20__
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( 1, rowTop, 1, rowBottom );
     dc.DrawLine( 1, rowTop, m_rowLabelWidth - 1, rowTop );
-#endif
 
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );
@@ -7977,6 +7939,18 @@ def __WXGTK20__
     DrawTextRectangle( dc, GetRowLabelValue( row ), rect, hAlign, vAlign );
 }
 
+void wxGrid::SetUseNativeColLabels( bool native )
+{
+    m_nativeColumnLabels = native;
+    if (native)
+    {
+        int height = wxRendererNative::Get().GetHeaderButtonHeight( this );
+        SetColLabelSize( height );
+    }
+    
+    m_colLabelWin->Refresh();
+}
+
 void wxGrid::DrawColLabels( wxDC& dc,const wxArrayInt& cols )
 {
     if ( !m_numCols )
@@ -8000,29 +7974,30 @@ void wxGrid::DrawColLabel( wxDC& dc, int col )
 
     wxRect rect;
 
-#if 0
-def __WXGTK20__
-    rect.SetX( colLeft + 1 );
-    rect.SetY( 1 );
-    rect.SetWidth( GetColWidth(col) - 2 );
-    rect.SetHeight( m_colLabelHeight - 2 );
-
-    wxWindowDC *win_dc = (wxWindowDC*) &dc;
+    if (m_nativeColumnLabels)
+    {
+        rect.SetX( colLeft);
+        rect.SetY( 0 );
+        rect.SetWidth( GetColWidth(col));
+        rect.SetHeight( m_colLabelHeight );
 
-    wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
-#else
-    int colRight = GetColRight(col) - 1;
+        wxWindowDC *win_dc = (wxWindowDC*) &dc;
+        wxRendererNative::Get().DrawHeaderButton( win_dc->GetWindow(), dc, rect, 0 );
+    }
+    else
+    {
+        int colRight = GetColRight(col) - 1;
 
-    dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) );
-    dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 );
-    dc.DrawLine( colLeft, 0, colRight, 0 );
-    dc.DrawLine( colLeft, m_colLabelHeight - 1,
+        dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) );
+        dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 );
+        dc.DrawLine( colLeft, 0, colRight, 0 );
+        dc.DrawLine( colLeft, m_colLabelHeight - 1,
                  colRight + 1, m_colLabelHeight - 1 );
 
-    dc.SetPen( *wxWHITE_PEN );
-    dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 );
-    dc.DrawLine( colLeft, 1, colRight, 1 );
-#endif
+        dc.SetPen( *wxWHITE_PEN );
+        dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 );
+        dc.DrawLine( colLeft, 1, colRight, 1 );
+    }
 
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );
@@ -8120,7 +8095,7 @@ void wxGrid::DrawTextRectangle(wxDC& dc,
             continue;
         }
 
-        long lineWidth = 0,
+        wxCoord lineWidth = 0,
              lineHeight = 0;
         dc.GetTextExtent(line, &lineWidth, &lineHeight);
 
@@ -8201,9 +8176,9 @@ void wxGrid::GetTextBoxSize( const wxDC& dc,
                              const wxArrayString& lines,
                              long *width, long *height ) const
 {
-    long w = 0;
-    long h = 0;
-    long lineW = 0, lineH = 0;
+    wxCoord w = 0;
+    wxCoord h = 0;
+    wxCoord lineW = 0, lineH = 0;
 
     size_t i;
     for ( i = 0; i < lines.GetCount(); i++ )
@@ -8459,7 +8434,7 @@ void wxGrid::ShowCellEditControl()
                 if (rect.GetRight() > client_right)
                     rect.SetRight( client_right - 1 );
             }
-
+            
             editor->SetCellAttr( attr );
             editor->SetSize( rect );
             if (nXMove != 0)
@@ -9662,7 +9637,7 @@ void wxGrid::SetCellHighlightPenWidth(int width)
         // make any visible change if the the thickness is getting smaller.
         int row = m_currentCellCoords.GetRow();
         int col = m_currentCellCoords.GetCol();
-        if ( GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 )
+        if ( row == -1 || col == -1 || GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 )
             return;
 
         wxRect rect = CellToRect(row, col);
@@ -10268,10 +10243,7 @@ wxGridCellEditor * wxGrid::GetDefaultEditorForType(const wxString& typeName) con
     int index = m_typeRegistry->FindOrCloneDataType(typeName);
     if ( index == wxNOT_FOUND )
     {
-        wxString errStr;
-
-        errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str());
-        wxFAIL_MSG(errStr.c_str());
+        wxFAIL_MSG(wxString::Format(wxT("Unknown data type name [%s]"), typeName.c_str()));
 
         return NULL;
     }
@@ -10284,10 +10256,7 @@ wxGridCellRenderer * wxGrid::GetDefaultRendererForType(const wxString& typeName)
     int index = m_typeRegistry->FindOrCloneDataType(typeName);
     if ( index == wxNOT_FOUND )
     {
-        wxString errStr;
-
-        errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str());
-        wxFAIL_MSG(errStr.c_str());
+        wxFAIL_MSG(wxString::Format(wxT("Unknown data type name [%s]"), typeName.c_str()));
 
         return NULL;
     }
@@ -10568,6 +10537,12 @@ wxGrid::AutoSizeColOrRow(int colOrRow, bool setAsMin, wxGridDirection direction)
 
     if ( column )
     {
+        // Ensure automatic width is not less than minimal width. See the
+        // comment in SetColSize() for explanation of why this isn't done
+        // in SetColSize().
+        if ( !setAsMin )
+            extentMax = wxMax(extentMax, GetColMinimalWidth(col));
+
         SetColSize( col, extentMax );
         if ( !GetBatchCount() )
         {
@@ -10583,6 +10558,12 @@ wxGrid::AutoSizeColOrRow(int colOrRow, bool setAsMin, wxGridDirection direction)
     }
     else
     {
+        // Ensure automatic width is not less than minimal height. See the
+        // comment in SetColSize() for explanation of why this isn't done
+        // in SetRowSize().
+        if ( !setAsMin )
+            extentMax = wxMax(extentMax, GetRowMinimalHeight(row));
+
         SetRowSize(row, extentMax);
         if ( !GetBatchCount() )
         {
@@ -10629,9 +10610,10 @@ wxCoord wxGrid::CalcColOrRowLabelAreaMinSize(wxGridDirection direction)
     for ( int rowOrCol = 0; rowOrCol < numRowsOrCols; rowOrCol++ )
     {
         lines.Clear();
-        StringToLines(calcRows ? GetRowLabelValue(rowOrCol)
-                               : GetColLabelValue(rowOrCol),
-                      lines);
+
+        wxString label = calcRows ? GetRowLabelValue(rowOrCol)
+                                  : GetColLabelValue(rowOrCol);
+        StringToLines(label, lines);
 
         long w, h;
         GetTextBoxSize(dc, lines, &w, &h);