X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1ef49ab576d21e0428eacf26c98a2f0fb62cb94d..824fd93d761e1e697be19a4ca582c5259e12c8ea:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index ea0184e2d0..cc293fb374 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -109,6 +109,7 @@ DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_LEFT_CLICK) DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_RIGHT_CLICK) DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_LEFT_DCLICK) DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_RIGHT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_BEGIN_DRAG) DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_LEFT_CLICK) DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_RIGHT_CLICK) DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_LEFT_DCLICK) @@ -3854,6 +3855,9 @@ wxGrid::wxGrid( wxWindow *parent, m_colMinWidths(GRID_HASH_SIZE), m_rowMinHeights(GRID_HASH_SIZE) { + // Can't use SetBestFittingSize here to avoid a crash as CreateGrid hasn't + // been called yet. + SetMinSize(size); Create(); } @@ -3868,9 +3872,11 @@ bool wxGrid::Create(wxWindow *parent, wxWindowID id, m_colMinWidths = wxLongToLongHashMap(GRID_HASH_SIZE) ; m_rowMinHeights = wxLongToLongHashMap(GRID_HASH_SIZE) ; + // Can't use SetBestFittingSize here to avoid a crash as CreateGrid hasn't + // been called yet. + SetMinSize(size); Create() ; - return true; } @@ -3990,15 +3996,15 @@ void wxGrid::Create() wxColour lfg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ); wxColour lbg = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ); #endif - m_cornerLabelWin->SetDefaultForegroundColour(lfg); - m_cornerLabelWin->SetDefaultBackgroundColour(lbg); - m_rowLabelWin->SetDefaultForegroundColour(lfg); - m_rowLabelWin->SetDefaultBackgroundColour(lbg); - m_colLabelWin->SetDefaultForegroundColour(lfg); - m_colLabelWin->SetDefaultBackgroundColour(lbg); + m_cornerLabelWin->SetOwnForegroundColour(lfg); + m_cornerLabelWin->SetOwnBackgroundColour(lbg); + m_rowLabelWin->SetOwnForegroundColour(lfg); + m_rowLabelWin->SetOwnBackgroundColour(lbg); + m_colLabelWin->SetOwnForegroundColour(lfg); + m_colLabelWin->SetOwnBackgroundColour(lbg); - m_gridWin->SetDefaultForegroundColour(gfg); - m_gridWin->SetDefaultBackgroundColour(gbg); + m_gridWin->SetOwnForegroundColour(gfg); + m_gridWin->SetOwnBackgroundColour(gbg); Init(); } @@ -4139,6 +4145,7 @@ void wxGrid::Init() m_canDragRowSize = true; m_canDragColSize = true; m_canDragGridSize = true; + m_canDragCell = false; m_dragLastPos = -1; m_dragRowOrCol = -1; m_isDragging = false; @@ -4312,16 +4319,16 @@ void wxGrid::CalcWindowSizes() int cw, ch; GetClientSize( &cw, &ch ); - if ( m_cornerLabelWin->IsShown() ) + if ( m_cornerLabelWin && m_cornerLabelWin->IsShown() ) m_cornerLabelWin->SetSize( 0, 0, m_rowLabelWidth, m_colLabelHeight ); - if ( m_colLabelWin->IsShown() ) + if ( m_colLabelWin && m_colLabelWin->IsShown() ) m_colLabelWin->SetSize( m_rowLabelWidth, 0, cw-m_rowLabelWidth, m_colLabelHeight); - if ( m_rowLabelWin->IsShown() ) + if ( m_rowLabelWin && m_rowLabelWin->IsShown() ) m_rowLabelWin->SetSize( 0, m_colLabelHeight, m_rowLabelWidth, ch-m_colLabelHeight); - if ( m_gridWin->IsShown() ) + if ( m_gridWin && m_gridWin->IsShown() ) m_gridWin->SetSize( m_rowLabelWidth, m_colLabelHeight, cw-m_rowLabelWidth, ch-m_colLabelHeight); } @@ -5346,6 +5353,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) XYToCell( x, y, coords ); int cell_rows, cell_cols; + bool isFirstDrag = !m_isDragging; GetCellSize( coords.GetRow(), coords.GetCol(), &cell_rows, &cell_cols ); if ((cell_rows < 0) || (cell_cols < 0)) { @@ -5396,6 +5404,19 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) m_selectingKeyboard = coords; HighlightBlock ( m_selectingKeyboard, coords ); } + else if ( CanDragCell() ) + { + if ( isFirstDrag ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords) + m_selectingKeyboard = coords; + + SendEvent( wxEVT_GRID_CELL_BEGIN_DRAG, + coords.GetRow(), + coords.GetCol(), + event ); + } + } else { if ( !IsSelection() ) @@ -9395,6 +9416,10 @@ void wxGrid::EnableDragGridSize( bool enable ) m_canDragGridSize = enable; } +void wxGrid::EnableDragCell( bool enable ) +{ + m_canDragCell = enable; +} void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows ) { @@ -9853,13 +9878,31 @@ wxSize wxGrid::DoGetBestSize() const width = self->SetOrCalcColumnSizes(true); height = self->SetOrCalcRowSizes(true); + if (!width) width=100; + if (!height) height=80; + + // Round up to a multiple the scroll rate NOTE: this still doesn't get rid + // of the scrollbars, is there any magic incantaion for that? + int xpu, ypu; + GetScrollPixelsPerUnit(&xpu, &ypu); + width += 1 + xpu - (width % xpu); + height += 1 + ypu - (height % ypu); + + // limit to 1/4 of the screen size int maxwidth, maxheight; wxDisplaySize( & maxwidth, & maxheight ); - + maxwidth /= 2; + maxheight /= 2; if ( width > maxwidth ) width = maxwidth; if ( height > maxheight ) height = maxheight; - return wxSize( width, height ); + + wxSize best(width, height); + // NOTE: This size should be cached, but first we need to add calls to + // InvalidateBestSize everywhere that could change the results of this + // calculation. + // CacheBestSize(size); + return best; } void wxGrid::Fit()