added possibility to reorder columns by dragging them (patch 1409677)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39498 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		| @@ -91,6 +91,7 @@ All (GUI): | ||||
| - Added wxDC::GradientFillLinear/Concentric() | ||||
| - Added wxHyperlinkCtrl (Francesco Montorsi) | ||||
| - Added clipboard events (wxEVT_COMMAND_TEXT_COPY/CUT/PASTE) | ||||
| - Allow to reorder wxGrid columns by drag-and-drop (Santiago Palacios) | ||||
| - Added wxRadioBox::SetItemToolTip() | ||||
| - Added support for CMYK JPEG images loading (Robert Wruck) | ||||
| - Added wxListCtrl::GetSubItemRect() and subitem hit testing (Agron Selimaj) | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| %% Name:        grid.tex | ||||
| %% Purpose:     wxGrid | ||||
| %% Author: | ||||
| %% Modified by: | ||||
| %% Modified by: Santiago Palacios | ||||
| %% Created: | ||||
| %% RCS-ID:      $Id$ | ||||
| %% Copyright:   (c) wxWidgets | ||||
| @@ -265,6 +265,15 @@ to the client size of the grid window. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::CanDragColMove}\label{wxgridcandragcolmove} | ||||
|  | ||||
| \func{bool}{CanDragColMove}{\void} | ||||
|  | ||||
| Returns true if columns can be moved by dragging with the mouse. Columns can be moved | ||||
| by dragging on their labels. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::CanDragColSize}\label{wxgridcandragcolsize} | ||||
|  | ||||
| \func{bool}{CanDragColSize}{\void} | ||||
| @@ -391,6 +400,15 @@ Equivalent to calling EnableCellEditControl(false). | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::DisableDragColMove}\label{wxgriddisabledragcolmove} | ||||
|  | ||||
| \func{void}{DisableDragColMove}{\void} | ||||
|  | ||||
| Disables column moving by dragging with the mouse. Equivalent to passing false to | ||||
| \helpref{wxGrid::EnableDragColMove}{wxgridenabledragcolmove}. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::DisableDragColSize}\label{wxgriddisabledragcolsize} | ||||
|  | ||||
| \func{void}{DisableDragColSize}{\void} | ||||
| @@ -435,6 +453,14 @@ Enables or disables column sizing by dragging with the mouse. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::EnableDragColMove}\label{wxgridenabledragcolmove} | ||||
|  | ||||
| \func{void}{EnableDragColMove}{\param{bool }{enable = true}} | ||||
|  | ||||
| Enables or disables column moving by dragging with the mouse. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::EnableDragGridSize}\label{wxgridenabledraggridsize} | ||||
|  | ||||
| \func{void}{EnableDragGridSize}{\param{bool }{enable = true}} | ||||
| @@ -596,6 +622,13 @@ and the \helpref{wxGrid overview}{gridoverview} for more information. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::GetColAt}\label{wxgridgetcolat} | ||||
|  | ||||
| \constfunc{int}{GetColAt}{\param{int }{colPos}} | ||||
|  | ||||
| Returns the column ID of the specified column position. | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::GetColLeft}\label{wxgridgetcolleft} | ||||
|  | ||||
| \constfunc{int}{GetColLeft}{\param{int }{col}} | ||||
| @@ -652,6 +685,14 @@ Get the minimal width of the given column/row. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::GetColPos}\label{wxgridgetcolpos} | ||||
|  | ||||
| \constfunc{int}{GetColPos}{\param{int }{colID}} | ||||
|  | ||||
| Returns the position of the specified column. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::GetColRight}\label{wxgridgetcolright} | ||||
|  | ||||
| \constfunc{int}{GetColRight}{\param{int }{col}} | ||||
| @@ -1543,6 +1584,14 @@ with sizes smaller than the value specified here. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::SetColPos}\label{wxgridsetcolpos} | ||||
|  | ||||
| \func{void}{SetColPos}{\param{int }{colID}, \param{int }{newPos}} | ||||
|  | ||||
| Sets the position of the specified column. | ||||
|  | ||||
|  | ||||
|  | ||||
| \membersection{wxGrid::SetColSize}\label{wxgridsetcolsize} | ||||
|  | ||||
| \func{void}{SetColSize}{\param{int }{col}, \param{int }{width}} | ||||
| @@ -1877,9 +1926,14 @@ Displays the in-place cell edit control for the current cell. | ||||
|  | ||||
| \membersection{wxGrid::XToCol}\label{wxgridxtocol} | ||||
|  | ||||
| \func{int}{XToCol}{\param{int }{x}} | ||||
| \func{int}{XToCol}{\param{int }{x}, \param{bool }{clipToMinMax = false}} | ||||
|  | ||||
| Returns the grid column that corresponds to the logical x coordinate. Returns  | ||||
| \wxheading{Parameters} | ||||
| \docparam{x}{The x position to evaluate.} | ||||
| \docparam{clipToMinMax}{If true, rather than returning wxNOT\_FOUND, it returns either the first or last column depending on whether x is too far to the left or right respectively.} | ||||
|  | ||||
| \wxheading{Return value} | ||||
| The grid column that corresponds to the logical x coordinate. Returns | ||||
| {\tt wxNOT\_FOUND} if there is no column at the x position. | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| // Name:        wx/generic/grid.h | ||||
| // Purpose:     wxGrid and related classes | ||||
| // Author:      Michael Bedward (based on code by Julian Smart, Robin Dunn) | ||||
| // Modified by: | ||||
| // Modified by: Santiago Palacios | ||||
| // Created:     1/08/1999 | ||||
| // RCS-ID:      $Id$ | ||||
| // Copyright:   (c) Michael Bedward | ||||
| @@ -1123,6 +1123,7 @@ public: | ||||
|  | ||||
|     void DoEndDragResizeRow(); | ||||
|     void DoEndDragResizeCol(); | ||||
|     void DoEndDragMoveCol(); | ||||
|  | ||||
|     wxGridTableBase * GetTable() const { return m_table; } | ||||
|     bool SetTable( wxGridTableBase *table, bool takeOwnership = false, | ||||
| @@ -1226,7 +1227,7 @@ public: | ||||
|     // | ||||
|     void XYToCell( int x, int y, wxGridCellCoords& ); | ||||
|     int  YToRow( int y ); | ||||
|     int  XToCol( int x ); | ||||
|     int  XToCol( int x, bool clipToMinMax = false ); | ||||
|  | ||||
|     int  YToEdgeOfRow( int y ); | ||||
|     int  XToEdgeOfCol( int x ); | ||||
| @@ -1306,6 +1307,9 @@ public: | ||||
|     void     EnableDragColSize( bool enable = true ); | ||||
|     void     DisableDragColSize() { EnableDragColSize( false ); } | ||||
|     bool     CanDragColSize() { return m_canDragColSize; } | ||||
|     void     EnableDragColMove( bool enable = true ); | ||||
|     void     DisableDragColMove() { EnableDragColMove( false ); } | ||||
|     bool     CanDragColMove() { return m_canDragColMove; } | ||||
|     void     EnableDragGridSize(bool enable = true); | ||||
|     void     DisableDragGridSize() { EnableDragGridSize(false); } | ||||
|     bool     CanDragGridSize() { return m_canDragGridSize; } | ||||
| @@ -1361,6 +1365,33 @@ public: | ||||
|  | ||||
|     void     SetColSize( int col, int width ); | ||||
|  | ||||
|     //Column positions | ||||
|     int GetColAt( int colPos ) const | ||||
|     { | ||||
|         if ( m_colAt.IsEmpty() ) | ||||
|             return colPos; | ||||
|         else | ||||
|             return m_colAt[colPos]; | ||||
|     } | ||||
|  | ||||
|     void SetColPos( int colID, int newPos ); | ||||
|  | ||||
|     int GetColPos( int colID ) const | ||||
|     { | ||||
|         if ( m_colAt.IsEmpty() ) | ||||
|             return colID; | ||||
|         else | ||||
|         { | ||||
|             for ( int i = 0; i < m_numCols; i++ ) | ||||
|             { | ||||
|                 if ( m_colAt[i] == colID ) | ||||
|                     return i; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     // automatically size the column or row to fit to its contents, if | ||||
|     // setAsMin is true, this optimal width will also be set as minimal width | ||||
|     // for this column | ||||
| @@ -1869,7 +1900,8 @@ protected: | ||||
|         WXGRID_CURSOR_RESIZE_ROW, | ||||
|         WXGRID_CURSOR_RESIZE_COL, | ||||
|         WXGRID_CURSOR_SELECT_ROW, | ||||
|         WXGRID_CURSOR_SELECT_COL | ||||
|         WXGRID_CURSOR_SELECT_COL, | ||||
|         WXGRID_CURSOR_MOVE_COL | ||||
|     }; | ||||
|  | ||||
|     // this method not only sets m_cursorMode but also sets the correct cursor | ||||
| @@ -1885,8 +1917,13 @@ protected: | ||||
|     wxWindow *m_winCapture;     // the window which captured the mouse | ||||
|     CursorMode m_cursorMode; | ||||
|  | ||||
|     //Column positions | ||||
|     wxArrayInt m_colAt; | ||||
|     int m_moveToCol; | ||||
|  | ||||
|     bool    m_canDragRowSize; | ||||
|     bool    m_canDragColSize; | ||||
|     bool    m_canDragColMove; | ||||
|     bool    m_canDragGridSize; | ||||
|     bool    m_canDragCell; | ||||
|     int     m_dragLastPos; | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| // Name:        griddemo.cpp | ||||
| // Purpose:     Grid control wxWidgets sample | ||||
| // Author:      Michael Bedward | ||||
| // Modified by: | ||||
| // Modified by: Santiago Palacios | ||||
| // RCS-ID:      $Id$ | ||||
| // Copyright:   (c) Michael Bedward, Julian Smart, Vadim Zeitlin | ||||
| // Licence:     wxWindows license | ||||
| @@ -68,6 +68,7 @@ BEGIN_EVENT_TABLE( GridFrame, wxFrame ) | ||||
|     EVT_MENU( ID_TOGGLEEDIT, GridFrame::ToggleEditing ) | ||||
|     EVT_MENU( ID_TOGGLEROWSIZING, GridFrame::ToggleRowSizing ) | ||||
|     EVT_MENU( ID_TOGGLECOLSIZING, GridFrame::ToggleColSizing ) | ||||
|     EVT_MENU( ID_TOGGLECOLMOVING, GridFrame::ToggleColMoving ) | ||||
|     EVT_MENU( ID_TOGGLEGRIDSIZING, GridFrame::ToggleGridSizing ) | ||||
|     EVT_MENU( ID_TOGGLEGRIDDRAGCELL, GridFrame::ToggleGridDragCell ) | ||||
|     EVT_MENU( ID_TOGGLEGRIDLINES, GridFrame::ToggleGridLines ) | ||||
| @@ -146,6 +147,7 @@ GridFrame::GridFrame() | ||||
|     viewMenu->Append( ID_TOGGLEEDIT,  _T("&Editable"), wxEmptyString, wxITEM_CHECK ); | ||||
|     viewMenu->Append( ID_TOGGLEROWSIZING, _T("Ro&w drag-resize"), wxEmptyString, wxITEM_CHECK ); | ||||
|     viewMenu->Append( ID_TOGGLECOLSIZING, _T("C&ol drag-resize"), wxEmptyString, wxITEM_CHECK ); | ||||
|     viewMenu->Append( ID_TOGGLECOLMOVING, _T("Col drag-&move"), wxEmptyString, wxITEM_CHECK ); | ||||
|     viewMenu->Append( ID_TOGGLEGRIDSIZING, _T("&Grid drag-resize"), wxEmptyString, wxITEM_CHECK ); | ||||
|     viewMenu->Append( ID_TOGGLEGRIDDRAGCELL, _T("&Grid drag-cell"), wxEmptyString, wxITEM_CHECK ); | ||||
|     viewMenu->Append( ID_TOGGLEGRIDLINES, _T("&Grid Lines"), wxEmptyString, wxITEM_CHECK ); | ||||
| @@ -376,6 +378,7 @@ void GridFrame::SetDefaults() | ||||
|     GetMenuBar()->Check( ID_TOGGLEEDIT, true ); | ||||
|     GetMenuBar()->Check( ID_TOGGLEROWSIZING, true ); | ||||
|     GetMenuBar()->Check( ID_TOGGLECOLSIZING, true ); | ||||
|     GetMenuBar()->Check( ID_TOGGLECOLMOVING, false ); | ||||
|     GetMenuBar()->Check( ID_TOGGLEGRIDSIZING, true ); | ||||
|     GetMenuBar()->Check( ID_TOGGLEGRIDDRAGCELL, false ); | ||||
|     GetMenuBar()->Check( ID_TOGGLEGRIDLINES, true ); | ||||
| @@ -429,6 +432,12 @@ void GridFrame::ToggleColSizing( wxCommandEvent& WXUNUSED(ev) ) | ||||
|         GetMenuBar()->IsChecked( ID_TOGGLECOLSIZING ) ); | ||||
| } | ||||
|  | ||||
| void GridFrame::ToggleColMoving( wxCommandEvent& WXUNUSED(ev) ) | ||||
| { | ||||
|     grid->EnableDragColMove( | ||||
|         GetMenuBar()->IsChecked( ID_TOGGLECOLMOVING ) ); | ||||
| } | ||||
|  | ||||
| void GridFrame::ToggleGridSizing( wxCommandEvent& WXUNUSED(ev) ) | ||||
| { | ||||
|     grid->EnableDragGridSize( | ||||
| @@ -927,6 +936,11 @@ void GridFrame::OnSelectCell( wxGridEvent& ev ) | ||||
|            << _T(", ShiftDown: ")<< (ev.ShiftDown() ? 'T':'F') | ||||
|            << _T(", AltDown: ")<< (ev.AltDown() ? 'T':'F') | ||||
|            << _T(", MetaDown: ")<< (ev.MetaDown() ? 'T':'F') << _T(" )"); | ||||
|  | ||||
|     //Indicate whether this column was moved | ||||
|     if ( ((wxGrid *)ev.GetEventObject())->GetColPos( ev.GetCol() ) != ev.GetCol() ) | ||||
|         logBuf << _T(" *** Column moved, current position: ") << ((wxGrid *)ev.GetEventObject())->GetColPos( ev.GetCol() ); | ||||
|  | ||||
|     wxLogMessage( wxT("%s"), logBuf.c_str() ); | ||||
|  | ||||
|     // you must call Skip() if you want the default processing | ||||
|   | ||||
| @@ -37,6 +37,7 @@ class GridFrame : public wxFrame | ||||
|     void ToggleEditing( wxCommandEvent& ); | ||||
|     void ToggleRowSizing( wxCommandEvent& ); | ||||
|     void ToggleColSizing( wxCommandEvent& ); | ||||
|     void ToggleColMoving( wxCommandEvent& ); | ||||
|     void ToggleGridSizing( wxCommandEvent& ); | ||||
|     void ToggleGridDragCell ( wxCommandEvent& ); | ||||
|     void ToggleGridLines( wxCommandEvent& ); | ||||
| @@ -107,6 +108,7 @@ public: | ||||
|         ID_TOGGLEEDIT, | ||||
|         ID_TOGGLEROWSIZING, | ||||
|         ID_TOGGLECOLSIZING, | ||||
|         ID_TOGGLECOLMOVING, | ||||
|         ID_TOGGLEGRIDSIZING, | ||||
|         ID_TOGGLEGRIDDRAGCELL, | ||||
|         ID_TOGGLEGRIDLINES, | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| // Name:        src/generic/grid.cpp | ||||
| // Purpose:     wxGrid and related classes | ||||
| // Author:      Michael Bedward (based on code by Julian Smart, Robin Dunn) | ||||
| // Modified by: Robin Dunn, Vadim Zeitlin | ||||
| // Modified by: Robin Dunn, Vadim Zeitlin, Santiago Palacios | ||||
| // Created:     1/08/1999 | ||||
| // RCS-ID:      $Id$ | ||||
| // Copyright:   (c) Michael Bedward (mbedward@ozemail.com.au) | ||||
| @@ -104,6 +104,7 @@ DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_LEFT_DCLICK) | ||||
| DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_RIGHT_DCLICK) | ||||
| DEFINE_EVENT_TYPE(wxEVT_GRID_ROW_SIZE) | ||||
| DEFINE_EVENT_TYPE(wxEVT_GRID_COL_SIZE) | ||||
| DEFINE_EVENT_TYPE(wxEVT_GRID_COL_MOVE) | ||||
| DEFINE_EVENT_TYPE(wxEVT_GRID_RANGE_SELECT) | ||||
| DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_CHANGE) | ||||
| DEFINE_EVENT_TYPE(wxEVT_GRID_SELECT_CELL) | ||||
| @@ -622,7 +623,7 @@ void wxGridCellTextEditor::Create(wxWindow* parent, | ||||
|     m_control = new wxTextCtrl(parent, id, wxEmptyString, | ||||
|                                wxDefaultPosition, wxDefaultSize | ||||
| #if defined(__WXMSW__) | ||||
|                                , wxTE_PROCESS_TAB | wxTE_AUTO_SCROLL | ||||
|                                , wxTE_PROCESS_TAB | wxTE_AUTO_SCROLL | wxNO_BORDER | ||||
| #endif | ||||
|                               ); | ||||
|  | ||||
| @@ -658,16 +659,22 @@ void wxGridCellTextEditor::SetSize(const wxRect& rectOrig) | ||||
|         rect.width -= 1; | ||||
|         rect.height -= 1; | ||||
|     } | ||||
| #else // !GTK | ||||
|     int extra_x = ( rect.x > 2 ) ? 2 : 1; | ||||
| #elif defined(__WXMSW__) | ||||
|     if ( rect.x == 0 ) | ||||
|         rect.x += 2; | ||||
|     else | ||||
|         rect.x += 3; | ||||
|  | ||||
| // MB: treat MSW separately here otherwise the caret doesn't show | ||||
| // when the editor is in the first row. | ||||
| #if defined(__WXMSW__) | ||||
|     int extra_y = 2; | ||||
|     if ( rect.y == 0 ) | ||||
|         rect.y += 2; | ||||
|     else | ||||
|         rect.y += 3; | ||||
|  | ||||
|     rect.width -= 2; | ||||
|     rect.height -= 2; | ||||
| #else | ||||
|     int extra_x = ( rect.x > 2 ) ? 2 : 1; | ||||
|     int extra_y = ( rect.y > 2 ) ? 2 : 1; | ||||
| #endif | ||||
|  | ||||
|     #if defined(__WXMOTIF__) | ||||
|         extra_x *= 2; | ||||
| @@ -678,7 +685,7 @@ void wxGridCellTextEditor::SetSize(const wxRect& rectOrig) | ||||
|     rect.SetTop( wxMax(0, rect.y - extra_y) ); | ||||
|     rect.SetRight( rect.GetRight() + 2 * extra_x ); | ||||
|     rect.SetBottom( rect.GetBottom() + 2 * extra_y ); | ||||
| #endif // GTK/!GTK | ||||
| #endif | ||||
|  | ||||
|     wxGridCellEditor::SetSize(rect); | ||||
| } | ||||
| @@ -3506,6 +3513,15 @@ bool wxGridStringTable::InsertCols( size_t pos, size_t numCols ) | ||||
|         return AppendCols( numCols ); | ||||
|     } | ||||
|  | ||||
|     if ( !m_colLabels.IsEmpty() ) | ||||
|     { | ||||
|         m_colLabels.Insert( wxEmptyString, pos, numCols ); | ||||
|  | ||||
|         size_t i; | ||||
|         for ( i = pos; i < pos + numCols; i++ ) | ||||
|             m_colLabels[i] = wxGridTableBase::GetColLabelValue( i ); | ||||
|     } | ||||
|  | ||||
|     for ( row = 0; row < curNumRows; row++ ) | ||||
|     { | ||||
|         for ( col = pos; col < pos + numCols; col++ ) | ||||
| @@ -3580,9 +3596,20 @@ bool wxGridStringTable::DeleteCols( size_t pos, size_t numCols ) | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     if ( numCols > curNumCols - pos ) | ||||
|     int colID; | ||||
|     if ( GetView() ) | ||||
|         colID = GetView()->GetColAt( pos ); | ||||
|     else | ||||
|         colID = pos; | ||||
|  | ||||
|     if ( numCols > curNumCols - colID ) | ||||
|     { | ||||
|         numCols = curNumCols - pos; | ||||
|         numCols = curNumCols - colID; | ||||
|     } | ||||
|  | ||||
|     if ( !m_colLabels.IsEmpty() ) | ||||
|     { | ||||
|         m_colLabels.RemoveAt( colID, numCols ); | ||||
|     } | ||||
|  | ||||
|     for ( row = 0; row < curNumRows; row++ ) | ||||
| @@ -3593,7 +3620,7 @@ bool wxGridStringTable::DeleteCols( size_t pos, size_t numCols ) | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             m_data[row].RemoveAt( pos, numCols ); | ||||
|             m_data[row].RemoveAt( colID, numCols ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -3851,7 +3878,7 @@ void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) | ||||
|  | ||||
|     wxRendererNative::Get().DrawHeaderButton( this, dc, rect, 0 ); | ||||
| #else // !__WXGTK__ | ||||
|     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW), 1, wxSOLID) ); | ||||
|     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) ); | ||||
|     dc.DrawLine( client_width - 1, client_height - 1, client_width - 1, 0 ); | ||||
|     dc.DrawLine( client_width - 1, client_height - 1, 0, client_height - 1 ); | ||||
|     dc.DrawLine( 0, 0, client_width, 0 ); | ||||
| @@ -4006,9 +4033,7 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, | ||||
|                            const wxArrayInt& BorderArray, int nMax, | ||||
|                            bool clipToMinMax); | ||||
|  | ||||
| #define internalXToCol(x) CoordToRowOrCol(x, m_defaultColWidth, \ | ||||
|                                           m_minAcceptableColWidth, \ | ||||
|                                           m_colRights, m_numCols, true) | ||||
| #define internalXToCol(x) XToCol(x, true) | ||||
| #define internalYToRow(y) CoordToRowOrCol(y, m_defaultRowHeight, \ | ||||
|                                           m_minAcceptableRowHeight, \ | ||||
|                                           m_rowBottoms, m_numRows, true) | ||||
| @@ -4376,6 +4401,8 @@ void wxGrid::Init() | ||||
|     m_cellHighlightPenWidth = 2; | ||||
|     m_cellHighlightROPenWidth = 1; | ||||
|  | ||||
|     m_canDragColMove = false; | ||||
|  | ||||
|     m_cursorMode  = WXGRID_CURSOR_SELECT_CELL; | ||||
|     m_winCapture = (wxWindow *)NULL; | ||||
|     m_canDragRowSize = true; | ||||
| @@ -4453,7 +4480,7 @@ void wxGrid::InitColWidths() | ||||
|  | ||||
|     for ( int i = 0; i < m_numCols; i++ ) | ||||
|     { | ||||
|         colRight += m_defaultColWidth; | ||||
|         colRight = ( GetColPos( i ) + 1 ) * m_defaultColWidth; | ||||
|         m_colRights.Add( colRight ); | ||||
|     } | ||||
| } | ||||
| @@ -4465,13 +4492,13 @@ int wxGrid::GetColWidth(int col) const | ||||
|  | ||||
| int wxGrid::GetColLeft(int col) const | ||||
| { | ||||
|     return m_colRights.IsEmpty() ? col * m_defaultColWidth | ||||
|     return m_colRights.IsEmpty() ? GetColPos( col ) * m_defaultColWidth | ||||
|                                  : m_colRights[col] - m_colWidths[col]; | ||||
| } | ||||
|  | ||||
| int wxGrid::GetColRight(int col) const | ||||
| { | ||||
|     return m_colRights.IsEmpty() ? (col + 1) * m_defaultColWidth | ||||
|     return m_colRights.IsEmpty() ? (GetColPos( col ) + 1) * m_defaultColWidth | ||||
|                                  : m_colRights[col]; | ||||
| } | ||||
|  | ||||
| @@ -4503,7 +4530,7 @@ void wxGrid::CalcDimensions() | ||||
|         ch -= m_colLabelHeight; | ||||
|  | ||||
|     // grid total size | ||||
|     int w = m_numCols > 0 ? GetColRight(m_numCols - 1) + m_extraWidth + 1 : 0; | ||||
|     int w = m_numCols > 0 ? GetColRight(GetColAt( m_numCols - 1 )) + m_extraWidth + 1 : 0; | ||||
|     int h = m_numRows > 0 ? GetRowBottom(m_numRows - 1) + m_extraHeight + 1 : 0; | ||||
|  | ||||
|     // take into account editor if shown | ||||
| @@ -4755,6 +4782,25 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) | ||||
|             int numCols = msg.GetCommandInt2(); | ||||
|             m_numCols += numCols; | ||||
|  | ||||
|             if ( !m_colAt.IsEmpty() ) | ||||
|             { | ||||
|                 //Shift the column IDs | ||||
|                 int i; | ||||
|                 for ( i = 0; i < m_numCols - numCols; i++ ) | ||||
|                 { | ||||
|                     if ( m_colAt[i] >= (int)pos ) | ||||
|                         m_colAt[i] += numCols; | ||||
|                 } | ||||
|  | ||||
|                 m_colAt.Insert( pos, pos, numCols ); | ||||
|  | ||||
|                 //Set the new columns' positions | ||||
|                 for ( i = pos + 1; i < (int)pos + numCols; i++ ) | ||||
|                 { | ||||
|                     m_colAt[i] = i; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if ( !m_colWidths.IsEmpty() ) | ||||
|             { | ||||
|                 m_colWidths.Insert( m_defaultColWidth, pos, numCols ); | ||||
| @@ -4762,10 +4808,13 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) | ||||
|  | ||||
|                 int right = 0; | ||||
|                 if ( pos > 0 ) | ||||
|                     right = m_colRights[pos - 1]; | ||||
|                     right = m_colRights[GetColAt( pos - 1 )]; | ||||
|  | ||||
|                 for ( i = pos; i < m_numCols; i++ ) | ||||
|                 int colPos; | ||||
|                 for ( colPos = pos; colPos < m_numCols; colPos++ ) | ||||
|                 { | ||||
|                     i = GetColAt( colPos ); | ||||
|  | ||||
|                     right += m_colWidths[i]; | ||||
|                     m_colRights[i] = right; | ||||
|                 } | ||||
| @@ -4798,6 +4847,19 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) | ||||
|             int numCols = msg.GetCommandInt(); | ||||
|             int oldNumCols = m_numCols; | ||||
|             m_numCols += numCols; | ||||
|  | ||||
|             if ( !m_colAt.IsEmpty() ) | ||||
|             { | ||||
|                 m_colAt.Add( 0, numCols ); | ||||
|  | ||||
|                 //Set the new columns' positions | ||||
|                 int i; | ||||
|                 for ( i = oldNumCols; i < m_numCols; i++ ) | ||||
|                 { | ||||
|                     m_colAt[i] = i; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if ( !m_colWidths.IsEmpty() ) | ||||
|             { | ||||
|                 m_colWidths.Add( m_defaultColWidth, numCols ); | ||||
| @@ -4805,10 +4867,13 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) | ||||
|  | ||||
|                 int right = 0; | ||||
|                 if ( oldNumCols > 0 ) | ||||
|                     right = m_colRights[oldNumCols - 1]; | ||||
|                     right = m_colRights[GetColAt( oldNumCols - 1 )]; | ||||
|  | ||||
|                 for ( i = oldNumCols; i < m_numCols; i++ ) | ||||
|                 int colPos; | ||||
|                 for ( colPos = oldNumCols; colPos < m_numCols; colPos++ ) | ||||
|                 { | ||||
|                     i = GetColAt( colPos ); | ||||
|  | ||||
|                     right += m_colWidths[i]; | ||||
|                     m_colRights[i] = right; | ||||
|                 } | ||||
| @@ -4836,14 +4901,32 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) | ||||
|             int numCols = msg.GetCommandInt2(); | ||||
|             m_numCols -= numCols; | ||||
|  | ||||
|             if ( !m_colAt.IsEmpty() ) | ||||
|             { | ||||
|                 int colID = GetColAt( pos ); | ||||
|  | ||||
|                 m_colAt.RemoveAt( pos, numCols ); | ||||
|  | ||||
|                 //Shift the column IDs | ||||
|                 int colPos; | ||||
|                 for ( colPos = 0; colPos < m_numCols; colPos++ ) | ||||
|                 { | ||||
|                     if ( m_colAt[colPos] > colID ) | ||||
|                         m_colAt[colPos] -= numCols; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if ( !m_colWidths.IsEmpty() ) | ||||
|             { | ||||
|                 m_colWidths.RemoveAt( pos, numCols ); | ||||
|                 m_colRights.RemoveAt( pos, numCols ); | ||||
|  | ||||
|                 int w = 0; | ||||
|                 for ( i = 0; i < m_numCols; i++ ) | ||||
|                 int colPos; | ||||
|                 for ( colPos = 0; colPos < m_numCols; colPos++ ) | ||||
|                 { | ||||
|                     i = GetColAt( colPos ); | ||||
|  | ||||
|                     w += m_colWidths[i]; | ||||
|                     m_colRights[i] = w; | ||||
|                 } | ||||
| @@ -4979,8 +5062,11 @@ wxArrayInt wxGrid::CalcColLabelsExposed( const wxRegion& reg ) | ||||
|         // find the cells within these bounds | ||||
|         // | ||||
|         int col; | ||||
|         for ( col = internalXToCol(left); col < m_numCols; col++ ) | ||||
|         int colPos; | ||||
|         for ( colPos = GetColPos( internalXToCol(left) ); colPos < m_numCols; colPos++ ) | ||||
|         { | ||||
|             col = GetColAt( colPos ); | ||||
|  | ||||
|             if ( GetColRight(col) < left ) | ||||
|                 continue; | ||||
|  | ||||
| @@ -5038,8 +5124,11 @@ wxGridCellCoordsArray wxGrid::CalcCellsExposed( const wxRegion& reg ) | ||||
|             if ( GetRowTop(row) > bottom ) | ||||
|                 break; | ||||
|  | ||||
|             for ( col = internalXToCol(left); col < m_numCols; col++ ) | ||||
|             int colPos; | ||||
|             for ( colPos = GetColPos( internalXToCol(left) ); colPos < m_numCols; colPos++ ) | ||||
|             { | ||||
|                 col = GetColAt( colPos ); | ||||
|  | ||||
|                 if ( GetColRight(col) <= left ) | ||||
|                     continue; | ||||
|  | ||||
| @@ -5287,6 +5376,9 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) | ||||
|         { | ||||
|             m_isDragging = true; | ||||
|             m_colLabelWin->CaptureMouse(); | ||||
|  | ||||
|             if ( m_cursorMode == WXGRID_CURSOR_MOVE_COL ) | ||||
|                 m_dragRowOrCol = XToCol( x ); | ||||
|         } | ||||
|  | ||||
|         if ( event.LeftIsDown() ) | ||||
| @@ -5330,6 +5422,63 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|                 case WXGRID_CURSOR_MOVE_COL: | ||||
|                 { | ||||
|                     if ( x < 0 ) | ||||
|                         m_moveToCol = GetColAt( 0 ); | ||||
|                     else | ||||
|                         m_moveToCol = XToCol( x ); | ||||
|  | ||||
|                     int markerX; | ||||
|  | ||||
|                     if ( m_moveToCol < 0 ) | ||||
|                         markerX = GetColRight( GetColAt( m_numCols - 1 ) ); | ||||
|                     else | ||||
|                         markerX = GetColLeft( m_moveToCol ); | ||||
|  | ||||
|                     if ( markerX != m_dragLastPos ) | ||||
|                     { | ||||
|                         wxClientDC dc( m_colLabelWin ); | ||||
|  | ||||
|                         int cw, ch; | ||||
|                         m_colLabelWin->GetClientSize( &cw, &ch ); | ||||
|  | ||||
|                         markerX++; | ||||
|  | ||||
|                         //Clean up the last indicator | ||||
|                         if ( m_dragLastPos >= 0 ) | ||||
|                         { | ||||
|                             wxPen pen( m_colLabelWin->GetBackgroundColour(), 2 ); | ||||
|                             dc.SetPen(pen); | ||||
|                             dc.DrawLine( m_dragLastPos + 1, 0, m_dragLastPos + 1, ch ); | ||||
|                             dc.SetPen(wxNullPen); | ||||
|  | ||||
|                             if ( XToCol( m_dragLastPos ) != -1 ) | ||||
|                                 DrawColLabel( dc, XToCol( m_dragLastPos ) ); | ||||
|                         } | ||||
|  | ||||
|                         //Moving to the same place? Don't draw a marker | ||||
|                         if ( (m_moveToCol == m_dragRowOrCol) | ||||
|                           || (GetColPos( m_moveToCol ) == GetColPos( m_dragRowOrCol ) + 1) | ||||
|                           || (m_moveToCol < 0 && m_dragRowOrCol == GetColAt( m_numCols - 1 ))) | ||||
|                         { | ||||
|                             m_dragLastPos = -1; | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         //Draw the marker | ||||
|                         wxPen pen( *wxBLUE, 2 ); | ||||
|                         dc.SetPen(pen); | ||||
|  | ||||
|                         dc.DrawLine( markerX, 0, markerX, ch ); | ||||
|  | ||||
|                         dc.SetPen(wxNullPen); | ||||
|  | ||||
|                         m_dragLastPos = markerX - 1; | ||||
|                     } | ||||
|                 } | ||||
|                 break; | ||||
|  | ||||
|                 // default label to suppress warnings about "enumeration value | ||||
|                 // 'xxx' not handled in switch | ||||
|                 default: | ||||
| @@ -5369,6 +5518,20 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) | ||||
|             col = XToCol(x); | ||||
|             if ( col >= 0 && | ||||
|                  !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) ) | ||||
|             { | ||||
|                 if ( m_canDragColMove ) | ||||
|                 { | ||||
|                     //Show button as pressed | ||||
|                     wxClientDC dc( m_colLabelWin ); | ||||
|                     int colLeft = GetColLeft( col ); | ||||
|                     int colRight = GetColRight( col ) - 1; | ||||
|                     dc.SetPen( wxPen( m_colLabelWin->GetBackgroundColour(), 1 ) ); | ||||
|                     dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight-1 ); | ||||
|                     dc.DrawLine( colLeft, 1, colRight, 1 ); | ||||
|  | ||||
|                     ChangeCursorMode(WXGRID_CURSOR_MOVE_COL, m_colLabelWin); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if ( !event.ShiftDown() && !event.CmdDown() ) | ||||
|                         ClearSelection(); | ||||
| @@ -5397,6 +5560,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) | ||||
|                     ChangeCursorMode(WXGRID_CURSOR_SELECT_COL, m_colLabelWin); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // starting to drag-resize a col | ||||
| @@ -5434,7 +5598,9 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) | ||||
|     // | ||||
|     else if ( event.LeftUp() ) | ||||
|     { | ||||
|         if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL ) | ||||
|         switch ( m_cursorMode ) | ||||
|         { | ||||
|             case WXGRID_CURSOR_RESIZE_COL: | ||||
|             { | ||||
|                 DoEndDragResizeCol(); | ||||
|  | ||||
| @@ -5443,6 +5609,16 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) | ||||
|                 // | ||||
|                 SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event ); | ||||
|             } | ||||
|             break; | ||||
|  | ||||
|             case WXGRID_CURSOR_MOVE_COL: | ||||
|             { | ||||
|                 DoEndDragMoveCol(); | ||||
|  | ||||
|                 SendEvent( wxEVT_GRID_COL_MOVE, -1, m_dragRowOrCol, event ); | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); | ||||
|         m_dragLastPos = -1; | ||||
| @@ -5536,7 +5712,8 @@ void wxGrid::ChangeCursorMode(CursorMode mode, | ||||
|         _T("RESIZE_ROW"), | ||||
|         _T("RESIZE_COL"), | ||||
|         _T("SELECT_ROW"), | ||||
|         _T("SELECT_COL") | ||||
|         _T("SELECT_COL"), | ||||
|         _T("MOVE_COL"), | ||||
|     }; | ||||
|  | ||||
|     wxLogTrace(_T("grid"), | ||||
| @@ -5577,6 +5754,10 @@ void wxGrid::ChangeCursorMode(CursorMode mode, | ||||
|             win->SetCursor( m_colResizeCursor ); | ||||
|             break; | ||||
|  | ||||
|         case WXGRID_CURSOR_MOVE_COL: | ||||
|             win->SetCursor( wxCursor(wxCURSOR_HAND) ); | ||||
|             break; | ||||
|  | ||||
|         default: | ||||
|             win->SetCursor( *wxSTANDARD_CURSOR ); | ||||
|             break; | ||||
| @@ -6099,6 +6280,112 @@ void wxGrid::DoEndDragResizeCol() | ||||
|     } | ||||
| } | ||||
|  | ||||
| void wxGrid::DoEndDragMoveCol() | ||||
| { | ||||
|     //The user clicked on the column but didn't actually drag | ||||
|     if ( m_dragLastPos < 0 ) | ||||
|     { | ||||
|         m_colLabelWin->Refresh();   //Do this to "unpress" the column | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     int newPos; | ||||
|     if ( m_moveToCol == -1 ) | ||||
|         newPos = m_numCols - 1; | ||||
|     else | ||||
|     { | ||||
|         newPos = GetColPos( m_moveToCol ); | ||||
|         if ( newPos > GetColPos( m_dragRowOrCol ) ) | ||||
|             newPos--; | ||||
|     } | ||||
|  | ||||
|     SetColPos( m_dragRowOrCol, newPos ); | ||||
| } | ||||
|  | ||||
| void wxGrid::SetColPos( int colID, int newPos ) | ||||
| { | ||||
|     if ( m_colAt.IsEmpty() ) | ||||
|     { | ||||
|         m_colAt.Alloc( m_numCols ); | ||||
|  | ||||
|         int i; | ||||
|         for ( i = 0; i < m_numCols; i++ ) | ||||
|         { | ||||
|             m_colAt.Add( i ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     int oldPos = GetColPos( colID ); | ||||
|  | ||||
|     //Reshuffle the m_colAt array | ||||
|     if ( newPos > oldPos ) | ||||
|     { | ||||
|         int i; | ||||
|         for ( i = oldPos; i < newPos; i++ ) | ||||
|         { | ||||
|             m_colAt[i] = m_colAt[i+1]; | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         int i; | ||||
|         for ( i = oldPos; i > newPos; i-- ) | ||||
|         { | ||||
|             m_colAt[i] = m_colAt[i-1]; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     m_colAt[newPos] = colID; | ||||
|  | ||||
|     //Recalculate the column rights | ||||
|     if ( !m_colWidths.IsEmpty() ) | ||||
|     { | ||||
|         int colRight = 0; | ||||
|         int colPos; | ||||
|         for ( colPos = 0; colPos < m_numCols; colPos++ ) | ||||
|         { | ||||
|             int colID = GetColAt( colPos ); | ||||
|  | ||||
|             colRight += m_colWidths[colID]; | ||||
|             m_colRights[colID] = colRight; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     m_colLabelWin->Refresh(); | ||||
|     m_gridWin->Refresh(); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void wxGrid::EnableDragColMove( bool enable ) | ||||
| { | ||||
|     if ( m_canDragColMove == enable ) | ||||
|         return; | ||||
|  | ||||
|     m_canDragColMove = enable; | ||||
|  | ||||
|     if ( !m_canDragColMove ) | ||||
|     { | ||||
|         m_colAt.Clear(); | ||||
|  | ||||
|         //Recalculate the column rights | ||||
|         if ( !m_colWidths.IsEmpty() ) | ||||
|         { | ||||
|             int colRight = 0; | ||||
|             int colPos; | ||||
|             for ( colPos = 0; colPos < m_numCols; colPos++ ) | ||||
|             { | ||||
|                 colRight += m_colWidths[colPos]; | ||||
|                 m_colRights[colPos] = colRight; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         m_colLabelWin->Refresh(); | ||||
|         m_gridWin->Refresh(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| // | ||||
| // ------ interaction with data model | ||||
| // | ||||
| @@ -7094,7 +7381,7 @@ void wxGrid::DrawGridSpace( wxDC& dc ) | ||||
|   int right, bottom; | ||||
|   CalcUnscrolledPosition( cw, ch, &right, &bottom ); | ||||
|  | ||||
|   int rightCol = m_numCols > 0 ? GetColRight(m_numCols - 1) : 0; | ||||
|   int rightCol = m_numCols > 0 ? GetColRight(GetColAt( m_numCols - 1 )) : 0; | ||||
|   int bottomRow = m_numRows > 0 ? GetRowBottom(m_numRows - 1) : 0; | ||||
|  | ||||
|   if ( right > rightCol || bottom > bottomRow ) | ||||
| @@ -7315,13 +7602,13 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) ) | ||||
|  | ||||
|     // avoid drawing grid lines past the last row and col | ||||
|     // | ||||
|     right = wxMin( right, GetColRight(m_numCols - 1) ); | ||||
|     right = wxMin( right, GetColRight(GetColAt( m_numCols - 1 )) ); | ||||
|     bottom = wxMin( bottom, GetRowBottom(m_numRows - 1) ); | ||||
|  | ||||
|     // no gridlines inside multicells, clip them out | ||||
|     int leftCol = internalXToCol(left); | ||||
|     int leftCol = GetColPos( internalXToCol(left) ); | ||||
|     int topRow = internalYToRow(top); | ||||
|     int rightCol = internalXToCol(right); | ||||
|     int rightCol = GetColPos( internalXToCol(right) ); | ||||
|     int bottomRow = internalYToRow(bottom); | ||||
|  | ||||
| #ifndef __WXMAC__ | ||||
| @@ -7333,8 +7620,11 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) ) | ||||
|  | ||||
|     for (j=topRow; j<bottomRow; j++) | ||||
|     { | ||||
|         for (i=leftCol; i<rightCol; i++) | ||||
|         int colPos; | ||||
|         for (colPos=leftCol; colPos<rightCol; colPos++) | ||||
|         { | ||||
|             i = GetColAt( colPos ); | ||||
|  | ||||
|             GetCellSize( j, i, &cell_rows, &cell_cols ); | ||||
|             if ((cell_rows > 1) || (cell_cols > 1)) | ||||
|             { | ||||
| @@ -7399,8 +7689,11 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) ) | ||||
|  | ||||
|     // vertical grid lines | ||||
|     // | ||||
|     for ( i = internalXToCol(left); i < m_numCols; i++ ) | ||||
|     int colPos; | ||||
|     for ( colPos = leftCol; colPos < m_numCols; colPos++ ) | ||||
|     { | ||||
|         i = GetColAt( colPos ); | ||||
|  | ||||
|         int colRight = GetColRight(i) - 1; | ||||
|         if ( colRight > right ) | ||||
|         { | ||||
| @@ -7452,7 +7745,7 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row ) | ||||
|     int rowTop = GetRowTop(row), | ||||
|         rowBottom = GetRowBottom(row) - 1; | ||||
|  | ||||
|     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW), 1, wxSOLID) ); | ||||
|     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) ); | ||||
|     dc.DrawLine( m_rowLabelWidth - 1, rowTop, m_rowLabelWidth - 1, rowBottom ); | ||||
|     dc.DrawLine( 0, rowTop, 0, rowBottom ); | ||||
|     dc.DrawLine( 0, rowBottom, m_rowLabelWidth, rowBottom ); | ||||
| @@ -7511,7 +7804,7 @@ void wxGrid::DrawColLabel( wxDC& dc, int col ) | ||||
| #else | ||||
|     int colRight = GetColRight(col) - 1; | ||||
|  | ||||
|     dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW), 1, wxSOLID) ); | ||||
|     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, | ||||
| @@ -7887,16 +8180,13 @@ void wxGrid::ShowCellEditControl() | ||||
|             if (rect.x < 0) | ||||
|                 nXMove = rect.x; | ||||
|  | ||||
|             // performed in PaintBackground() | ||||
| #if 0 | ||||
|             // erase the highlight and the cell contents because the editor | ||||
|             // might not cover the entire cell | ||||
|             wxClientDC dc( m_gridWin ); | ||||
|             PrepareDC( dc ); | ||||
|             dc.SetBrush(*wxLIGHT_GREY_BRUSH); //wxBrush(attr->GetBackgroundColour(), wxSOLID)); | ||||
|             dc.SetBrush(wxBrush(GetCellAttr(row, col)->GetBackgroundColour(), wxSOLID)); | ||||
|             dc.SetPen(*wxTRANSPARENT_PEN); | ||||
|             dc.DrawRectangle(rect); | ||||
| #endif | ||||
|  | ||||
|             // cell is shifted by one pixel | ||||
|             // However, don't allow x or y to become negative | ||||
| @@ -8135,10 +8425,65 @@ int wxGrid::YToRow( int y ) | ||||
|                            m_minAcceptableRowHeight, m_rowBottoms, m_numRows, false); | ||||
| } | ||||
|  | ||||
| int wxGrid::XToCol( int x ) | ||||
| int wxGrid::XToCol( int x, bool clipToMinMax ) | ||||
| { | ||||
|     return CoordToRowOrCol(x, m_defaultColWidth, | ||||
|                            m_minAcceptableColWidth, m_colRights, m_numCols, false); | ||||
|     if (x < 0) | ||||
|         return clipToMinMax && (m_numCols > 0) ? GetColAt( 0 ) : -1; | ||||
|  | ||||
|     if (!m_defaultColWidth) | ||||
|         m_defaultColWidth = 1; | ||||
|  | ||||
|     int maxPos = x / m_defaultColWidth; | ||||
|     int minPos = 0; | ||||
|  | ||||
|     if (m_colRights.IsEmpty()) | ||||
|     { | ||||
|         if(maxPos < m_numCols) | ||||
|             return GetColAt( maxPos ); | ||||
|         return clipToMinMax ? GetColAt( m_numCols - 1 ) : -1; | ||||
|     } | ||||
|  | ||||
|     if ( maxPos >= m_numCols) | ||||
|         maxPos = m_numCols - 1; | ||||
|     else | ||||
|     { | ||||
|         if ( x >= m_colRights[GetColAt( maxPos )]) | ||||
|         { | ||||
|             minPos = maxPos; | ||||
|             if (m_minAcceptableColWidth) | ||||
|                 maxPos = x / m_minAcceptableColWidth; | ||||
|             else | ||||
|                 maxPos =  m_numCols - 1; | ||||
|         } | ||||
|         if ( maxPos >= m_numCols) | ||||
|             maxPos = m_numCols - 1; | ||||
|     } | ||||
|  | ||||
|     //X is beyond the last column | ||||
|     if ( x >= m_colRights[GetColAt( maxPos )]) | ||||
|         return clipToMinMax ? GetColAt( maxPos ) : -1; | ||||
|  | ||||
|     //X is before the first column | ||||
|     if ( x < m_colRights[GetColAt( 0 )] ) | ||||
|         return GetColAt( 0 ); | ||||
|  | ||||
|     //Perform a binary search | ||||
|     while ( maxPos - minPos > 0 ) | ||||
|     { | ||||
|         wxCHECK_MSG(m_colRights[GetColAt( minPos )] <= x && x < m_colRights[GetColAt( maxPos )], | ||||
|                     0, _T("wxGrid: internal error in XToCol")); | ||||
|  | ||||
|         if (x >=  m_colRights[GetColAt( maxPos - 1 )]) | ||||
|             return GetColAt( maxPos ); | ||||
|         else | ||||
|             maxPos--; | ||||
|         int median = minPos + (maxPos - minPos + 1) / 2; | ||||
|         if (x < m_colRights[GetColAt( median )]) | ||||
|             maxPos = median; | ||||
|         else | ||||
|             minPos = median; | ||||
|     } | ||||
|     return GetColAt( maxPos ); | ||||
| } | ||||
|  | ||||
| // return the row number that that the y coord is near the edge of, or | ||||
| @@ -8418,11 +8763,12 @@ bool wxGrid::MoveCursorLeft( bool expandSelection ) | ||||
|                 HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); | ||||
|             } | ||||
|         } | ||||
|         else if ( m_currentCellCoords.GetCol() > 0 ) | ||||
|         else if ( GetColPos( m_currentCellCoords.GetCol() ) > 0 ) | ||||
|         { | ||||
|             int row = m_currentCellCoords.GetRow(); | ||||
|             int col = m_currentCellCoords.GetCol() - 1; | ||||
|             int col = GetColAt( GetColPos( m_currentCellCoords.GetCol() ) - 1 ); | ||||
|             ClearSelection(); | ||||
|  | ||||
|             MakeCellVisible( row, col ); | ||||
|             SetCurrentCell( row, col ); | ||||
|         } | ||||
| @@ -8452,11 +8798,12 @@ bool wxGrid::MoveCursorRight( bool expandSelection ) | ||||
|                 HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); | ||||
|             } | ||||
|         } | ||||
|         else if ( m_currentCellCoords.GetCol() < m_numCols - 1 ) | ||||
|         else if ( GetColPos( m_currentCellCoords.GetCol() ) < m_numCols - 1 ) | ||||
|         { | ||||
|             int row = m_currentCellCoords.GetRow(); | ||||
|             int col = m_currentCellCoords.GetCol() + 1; | ||||
|             int col = GetColAt( GetColPos( m_currentCellCoords.GetCol() ) + 1 ); | ||||
|             ClearSelection(); | ||||
|  | ||||
|             MakeCellVisible( row, col ); | ||||
|             SetCurrentCell( row, col ); | ||||
|         } | ||||
| @@ -9812,7 +10159,7 @@ void wxGrid::SetColSize( int col, int width ) | ||||
|     // should we check that it's bigger than GetColMinimalWidth(col) here? | ||||
|     //                                                                 (VZ) | ||||
|     // No, because it is reasonable to assume the library user know's | ||||
|     // what he is doing. However whe should test against the weaker | ||||
|     // what he is doing. However we should test against the weaker | ||||
|     // constraint of minimalAcceptableWidth, as this breaks rendering | ||||
|     // | ||||
|     // This test then fixes sf.net bug #645734 | ||||
| @@ -9843,8 +10190,10 @@ void wxGrid::SetColSize( int col, int width ) | ||||
|     m_colWidths[col] = w; | ||||
|  | ||||
|     int i; | ||||
|     for ( i = col; i < m_numCols; i++ ) | ||||
|     int colPos; | ||||
|     for ( colPos = GetColPos( col ); colPos < m_numCols; colPos++ ) | ||||
|     { | ||||
|         i = GetColAt( colPos ); | ||||
|         m_colRights[i] += diff; | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user