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)
wxGrid* grid)
{
wxString value = Combo()->GetValue();
- bool changed = value != m_startValue;
+ if ( value == m_startValue )
+ return false;
- if ( changed )
- grid->GetTable()->SetValue(row, col, value);
+ grid->GetTable()->SetValue(row, col, value);
- m_startValue = wxEmptyString;
- if (m_allowOthers)
- Combo()->SetValue(m_startValue);
- else
- Combo()->SetSelection(0);
-
- return changed;
+ return true;
}
void wxGridCellChoiceEditor::Reset()
m_rowMinHeights(GRID_HASH_SIZE)
{
Create();
+ SetBestFittingSize(size);
}
bool wxGrid::Create(wxWindow *parent, wxWindowID id,
m_rowMinHeights = wxLongToLongHashMap(GRID_HASH_SIZE) ;
Create() ;
-
+ SetBestFittingSize(size);
return true;
}
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();
}
m_canDragRowSize = true;
m_canDragColSize = true;
m_canDragGridSize = true;
+ m_canDragCell = false;
m_dragLastPos = -1;
m_dragRowOrCol = -1;
m_isDragging = false;
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);
}
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))
{
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() )
m_canDragGridSize = enable;
}
+void wxGrid::EnableDragCell( bool enable )
+{
+ m_canDragCell = enable;
+}
void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows )
{
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);
+ if (xpu)
+ width += 1 + xpu - (width % xpu);
+ if (ypu)
+ 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()