X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/25107357efda3e74e2752f28f95017a4fe158678..cde242b856935bb368f4582d17db47ef2f875ad7:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index e3436a8233..20121718e0 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -120,16 +120,43 @@ DEFINE_EVENT_TYPE(wxEVT_GRID_EDITOR_CREATED) // private classes // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_ADV wxGridRowLabelWindow : public wxWindow +// common base class for various grid subwindows +class WXDLLIMPEXP_ADV wxGridSubwindow : public wxWindow { public: - wxGridRowLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridSubwindow() { m_owner = NULL; } + wxGridSubwindow(wxGrid *owner, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int additionalStyle = 0, + const wxString& name = wxPanelNameStr) + : wxWindow(owner, id, pos, size, + wxWANTS_CHARS | wxBORDER_NONE | additionalStyle, + name) + { + m_owner = owner; + } + + wxGrid *GetOwner() { return m_owner; } + +protected: + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); + + wxGrid *m_owner; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridSubwindow) +}; + +class WXDLLIMPEXP_ADV wxGridRowLabelWindow : public wxGridSubwindow +{ +public: + wxGridRowLabelWindow() { } wxGridRowLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ); private: - wxGrid *m_owner; - void OnPaint( wxPaintEvent& event ); void OnMouseEvent( wxMouseEvent& event ); void OnMouseWheel( wxMouseEvent& event ); @@ -143,16 +170,14 @@ private: }; -class WXDLLIMPEXP_ADV wxGridColLabelWindow : public wxWindow +class WXDLLIMPEXP_ADV wxGridColLabelWindow : public wxGridSubwindow { public: - wxGridColLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridColLabelWindow() { } wxGridColLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ); private: - wxGrid *m_owner; - void OnPaint( wxPaintEvent& event ); void OnMouseEvent( wxMouseEvent& event ); void OnMouseWheel( wxMouseEvent& event ); @@ -166,16 +191,14 @@ private: }; -class WXDLLIMPEXP_ADV wxGridCornerLabelWindow : public wxWindow +class WXDLLIMPEXP_ADV wxGridCornerLabelWindow : public wxGridSubwindow { public: - wxGridCornerLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridCornerLabelWindow() { } wxGridCornerLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ); private: - wxGrid *m_owner; - void OnMouseEvent( wxMouseEvent& event ); void OnMouseWheel( wxMouseEvent& event ); void OnKeyDown( wxKeyEvent& event ); @@ -188,12 +211,11 @@ private: DECLARE_NO_COPY_CLASS(wxGridCornerLabelWindow) }; -class WXDLLIMPEXP_ADV wxGridWindow : public wxWindow +class WXDLLIMPEXP_ADV wxGridWindow : public wxGridSubwindow { public: wxGridWindow() { - m_owner = NULL; m_rowLabelWin = NULL; m_colLabelWin = NULL; } @@ -202,14 +224,10 @@ public: wxGridRowLabelWindow *rowLblWin, wxGridColLabelWindow *colLblWin, wxWindowID id, const wxPoint &pos, const wxSize &size ); - virtual ~wxGridWindow() {} void ScrollWindow( int dx, int dy, const wxRect *rect ); - wxGrid* GetOwner() { return m_owner; } - private: - wxGrid *m_owner; wxGridRowLabelWindow *m_rowLabelWin; wxGridColLabelWindow *m_colLabelWin; @@ -3648,7 +3666,12 @@ bool wxGridStringTable::DeleteCols( size_t pos, size_t numCols ) if ( !m_colLabels.IsEmpty() ) { - m_colLabels.RemoveAt( colID, numCols ); + // m_colLabels stores just as many elements as it needs, e.g. if only + // the label of the first column had been set it would have only one + // element and not numCols, so account for it + int nToRm = m_colLabels.size() - colID; + if ( nToRm > 0 ) + m_colLabels.RemoveAt( colID, nToRm ); } for ( row = 0; row < curNumRows; row++ ) @@ -3740,9 +3763,18 @@ void wxGridStringTable::SetColLabelValue( int col, const wxString& value ) ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// +BEGIN_EVENT_TABLE(wxGridSubwindow, wxWindow) + EVT_MOUSE_CAPTURE_LOST(wxGridSubwindow::OnMouseCaptureLost) +END_EVENT_TABLE() + +void wxGridSubwindow::OnMouseCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) +{ + m_owner->CancelMouseCapture(); +} + IMPLEMENT_DYNAMIC_CLASS( wxGridRowLabelWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxGridSubwindow ) EVT_PAINT( wxGridRowLabelWindow::OnPaint ) EVT_MOUSEWHEEL( wxGridRowLabelWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent ) @@ -3754,7 +3786,7 @@ END_EVENT_TABLE() wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) + : wxGridSubwindow(parent, id, pos, size) { m_owner = parent; } @@ -3813,7 +3845,7 @@ void wxGridRowLabelWindow::OnChar( wxKeyEvent& event ) IMPLEMENT_DYNAMIC_CLASS( wxGridColLabelWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxGridSubwindow ) EVT_PAINT( wxGridColLabelWindow::OnPaint ) EVT_MOUSEWHEEL( wxGridColLabelWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent ) @@ -3825,7 +3857,7 @@ END_EVENT_TABLE() wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) + : wxGridSubwindow(parent, id, pos, size) { m_owner = parent; } @@ -3887,7 +3919,7 @@ void wxGridColLabelWindow::OnChar( wxKeyEvent& event ) IMPLEMENT_DYNAMIC_CLASS( wxGridCornerLabelWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxGridSubwindow ) EVT_MOUSEWHEEL( wxGridCornerLabelWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridCornerLabelWindow::OnMouseEvent ) EVT_PAINT( wxGridCornerLabelWindow::OnPaint ) @@ -3899,7 +3931,7 @@ END_EVENT_TABLE() wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) + : wxGridSubwindow(parent, id, pos, size) { m_owner = parent; } @@ -3970,7 +4002,7 @@ void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event ) IMPLEMENT_DYNAMIC_CLASS( wxGridWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridWindow, wxGridSubwindow ) EVT_PAINT( wxGridWindow::OnPaint ) EVT_MOUSEWHEEL( wxGridWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridWindow::OnMouseEvent ) @@ -3988,10 +4020,8 @@ wxGridWindow::wxGridWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( - parent, id, pos, size, - wxWANTS_CHARS | wxBORDER_NONE | wxCLIP_CHILDREN | wxFULL_REPAINT_ON_RESIZE, - wxT("grid window") ) + : wxGridSubwindow(parent, id, pos, size, + wxCLIP_CHILDREN, wxT("grid window") ) { m_owner = parent; m_rowLabelWin = rowLblWin; @@ -4363,7 +4393,7 @@ bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership, // stop all processing m_created = false; - if (m_table) + if (m_table) { m_table->SetView(0); if( m_ownTable ) @@ -4401,7 +4431,7 @@ bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership, // original one current cell and selection regions // might be invalid, m_selectingKeyboard = wxGridNoCellCoords; - m_currentCellCoords = + m_currentCellCoords = wxGridCellCoords(wxMin(m_numRows, m_currentCellCoords.GetRow()), wxMin(m_numCols, m_currentCellCoords.GetCol())); if (m_selectingTopLeft.GetRow() >= m_numRows || @@ -5802,6 +5832,21 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event ) } } +void wxGrid::CancelMouseCapture() +{ + // cancel operation currently in progress, whatever it is + if ( m_winCapture ) + { + m_isDragging = false; + m_cursorMode = WXGRID_CURSOR_SELECT_CELL; + m_winCapture->SetCursor( *wxSTANDARD_CURSOR ); + m_winCapture = NULL; + + // remove traces of whatever we drew on screen + Refresh(); + } +} + void wxGrid::ChangeCursorMode(CursorMode mode, wxWindow *win, bool captureMouse) @@ -5969,7 +6014,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) m_winCapture->CaptureMouse(); } - + } else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) { @@ -6732,7 +6777,7 @@ int wxGrid::SendEvent( const wxEventType type, pos.y += GetColLabelSize(); if ( mouseEv.GetEventObject() == GetGridColLabelWindow() ) pos.x += GetRowLabelSize(); - + wxGridEvent gridEvt( GetId(), type, this, @@ -6898,14 +6943,10 @@ void wxGrid::Refresh(bool eraseb, const wxRect* rect) } } -void wxGrid::OnSize( wxSizeEvent& event ) +void wxGrid::OnSize(wxSizeEvent& WXUNUSED(event)) { - // position the child windows - CalcWindowSizes(); - - // don't call CalcDimensions() from here, the base class handles the size - // changes itself - event.Skip(); + // update our children window positions and scrollbars + CalcDimensions(); } void wxGrid::OnKeyDown( wxKeyEvent& event ) @@ -6933,7 +6974,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) else if (event.GetKeyCode() == WXK_LEFT) event.m_keyCode = WXK_RIGHT; } - + // try local handlers switch ( event.GetKeyCode() ) {