X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3f3dc2efd04fae213a225331f8533665fc4cf9b8..f9ceab7ce6f4543fea1860792b887f6d78d7c185:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 846f80a8b0..d639a82544 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -629,6 +629,7 @@ void wxGridCellTextEditor::DoBeginEdit(const wxString& startValue) { Text()->SetValue(startValue); Text()->SetInsertionPointEnd(); + Text()->SetSelection(-1,-1); Text()->SetFocus(); } @@ -797,8 +798,9 @@ void wxGridCellNumberEditor::BeginEdit(int row, int col, wxGrid* grid) } else { + m_valueOld = 0; wxString sValue = table->GetValue(row, col); - if (! sValue.ToLong(&m_valueOld)) + if (! sValue.ToLong(&m_valueOld) && ! sValue.IsEmpty()) { wxFAIL_MSG( _T("this cell doesn't have numeric value") ); return; @@ -820,16 +822,20 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col, wxGrid* grid) { bool changed; - long value; + long value = 0; + wxString text; if ( HasRange() ) { value = Spin()->GetValue(); changed = value != m_valueOld; + if (changed) + text = wxString::Format(wxT("%ld"), value); } else { - changed = Text()->GetValue().ToLong(&value) && (value != m_valueOld); + text = Text()->GetValue(); + changed = (text.IsEmpty() || text.ToLong(&value)) && (value != m_valueOld); } if ( changed ) @@ -837,7 +843,7 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col, if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_NUMBER)) grid->GetTable()->SetValueAsLong(row, col, value); else - grid->GetTable()->SetValue(row, col, wxString::Format(wxT("%ld"), value)); + grid->GetTable()->SetValue(row, col, text); } return changed; @@ -965,8 +971,9 @@ void wxGridCellFloatEditor::BeginEdit(int row, int col, wxGrid* grid) } else { + m_valueOld = 0.0; wxString sValue = table->GetValue(row, col); - if (! sValue.ToDouble(&m_valueOld)) + if (! sValue.ToDouble(&m_valueOld) && ! sValue.IsEmpty()) { wxFAIL_MSG( _T("this cell doesn't have float value") ); return; @@ -979,13 +986,15 @@ void wxGridCellFloatEditor::BeginEdit(int row, int col, wxGrid* grid) bool wxGridCellFloatEditor::EndEdit(int row, int col, wxGrid* grid) { - double value; - if ( Text()->GetValue().ToDouble(&value) && (value != m_valueOld) ) + double value = 0.0; + wxString text(Text()->GetValue()); + + if ( (text.IsEmpty() || text.ToDouble(&value)) && (value != m_valueOld) ) { if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT)) grid->GetTable()->SetValueAsDouble(row, col, value); else - grid->GetTable()->SetValue(row, col, wxString::Format(wxT("%f"), value)); + grid->GetTable()->SetValue(row, col, text); return TRUE; } @@ -1049,16 +1058,16 @@ wxString wxGridCellFloatEditor::GetString() const if ( m_width == -1 ) { // default width/precision - fmt = _T("%g"); + fmt = _T("%f"); } else if ( m_precision == -1 ) { // default precision - fmt.Printf(_T("%%%d.g"), m_width); + fmt.Printf(_T("%%%d.f"), m_width); } else { - fmt.Printf(_T("%%%d.%dg"), m_width, m_precision); + fmt.Printf(_T("%%%d.%df"), m_width, m_precision); } return wxString::Format(fmt, m_valueOld); @@ -3504,7 +3513,7 @@ void wxGridWindow::OnEraseBackground( wxEraseEvent& WXUNUSED(event) ) // Internal Helper function for computing row or column from some // (unscrolled) coordinate value, using either -// m_defaultRowHeight/m_defaultColWidth or binary search on array +// m_defaultRowHeight/m_defaultColWidth or binary search on array // of m_rowBottoms/m_ColRights to speed up the search! // Internal helper macros for simpler use of that function @@ -4464,7 +4473,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) if (m_isDragging) { - m_rowLabelWin->ReleaseMouse(); + if (m_rowLabelWin->HasCapture()) m_rowLabelWin->ReleaseMouse(); m_isDragging = FALSE; } @@ -4671,7 +4680,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) if (m_isDragging) { - m_colLabelWin->ReleaseMouse(); + if (m_colLabelWin->HasCapture()) m_colLabelWin->ReleaseMouse(); m_isDragging = FALSE; } @@ -4881,7 +4890,7 @@ void wxGrid::ChangeCursorMode(CursorMode mode, if ( m_winCapture ) { - m_winCapture->ReleaseMouse(); + if (m_winCapture->HasCapture()) m_winCapture->ReleaseMouse(); m_winCapture = (wxWindow *)NULL; } @@ -5110,7 +5119,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) SetCurrentCell( coords ); if ( m_selection ) { - if ( m_selection->GetSelectionMode() != + if ( m_selection->GetSelectionMode() != wxGrid::wxGridSelectCells ) { HighlightBlock( coords, coords ); @@ -5151,7 +5160,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) { if (m_winCapture) { - m_winCapture->ReleaseMouse(); + if (m_winCapture->HasCapture()) m_winCapture->ReleaseMouse(); m_winCapture = NULL; } @@ -6822,7 +6831,7 @@ void wxGrid::ShowCellEditControl() // cell is shifted by one pixel // However, don't allow x or y to become negative - // since the SetSize() method interprets that as + // since the SetSize() method interprets that as // "don't change." if (rect.x > 0) rect.x--; @@ -6932,7 +6941,7 @@ void wxGrid::XYToCell( int x, int y, wxGridCellCoords& coords ) // Internal Helper function for computing row or column from some // (unscrolled) coordinate value, using either -// m_defaultRowHeight/m_defaultColWidth or binary search on array +// m_defaultRowHeight/m_defaultColWidth or binary search on array // of m_rowBottoms/m_ColRights to speed up the search! static int CoordToRowOrCol(int coord, int defaultDist, int minDist, @@ -6949,7 +6958,7 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, if ( i_max >= BorderArray.GetCount()) i_max = BorderArray.GetCount() - 1; - else + else { if ( coord >= BorderArray[i_max]) {