void ScrollWindow( int dx, int dy, const wxRect *rect );
+ wxGrid* GetOwner() { return m_owner; }
+
private:
wxGrid *m_owner;
wxGridRowLabelWindow *m_rowLabelWin;
wxGridCellEditor::wxGridCellEditor()
{
m_control = NULL;
+ m_attr = NULL;
}
{
// erase the background because we might not fill the cell
wxClientDC dc(m_control->GetParent());
+ wxGridWindow* gridWindow = wxDynamicCast(m_control->GetParent(), wxGridWindow);
+ if (gridWindow)
+ gridWindow->GetOwner()->PrepareDC(dc);
+
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
dc.DrawRectangle(rectCell);
}
}
+// return the value in the text control
+wxString wxGridCellTextEditor::GetValue() const
+{
+ return Text()->GetValue();
+}
+
// ----------------------------------------------------------------------------
// wxGridCellNumberEditor
// ----------------------------------------------------------------------------
}
}
+// return the value in the spin control if it is there (the text control otherwise)
+wxString wxGridCellNumberEditor::GetValue() const
+{
+ wxString s;
+
+ if( HasRange() )
+ {
+ long value = Spin()->GetValue();
+ s.Printf(wxT("%ld"), value);
+ }
+ else
+ {
+ s = Text()->GetValue();
+ }
+ return s;
+}
+
// ----------------------------------------------------------------------------
// wxGridCellFloatEditor
// ----------------------------------------------------------------------------
size.y -= 2;
#endif
- m_control->Move(r.x + r.width/2 - size.x/2, r.y + r.height/2 - size.y/2);
+ int hAlign = wxALIGN_CENTRE;
+ int vAlign = wxALIGN_CENTRE;
+ if (GetCellAttr())
+ GetCellAttr()->GetAlignment(& hAlign, & vAlign);
+
+ int x = 0, y = 0;
+ if (hAlign == wxALIGN_LEFT)
+ {
+ x = r.x + 2;
+#ifdef __WXMSW__
+ x += 2;
+#endif
+ y = r.y + r.height/2 - size.y/2;
+ }
+ else if (hAlign == wxALIGN_RIGHT)
+ {
+ x = r.x + r.width - size.x - 2;
+ y = r.y + r.height/2 - size.y/2;
+ }
+ else if (hAlign == wxALIGN_CENTRE)
+ {
+ x = r.x + r.width/2 - size.x/2;
+ y = r.y + r.height/2 - size.y/2;
+ }
+
+ m_control->Move(x, y);
}
void wxGridCellBoolEditor::Show(bool show, wxGridCellAttr *attr)
return FALSE;
}
+// return the value as "1" for true and the empty string for false
+wxString wxGridCellBoolEditor::GetValue() const
+{
+ bool bSet = CBox()->GetValue();
+ return bSet ? _T("1") : wxEmptyString;
+}
+
#endif // wxUSE_CHECKBOX
#if wxUSE_COMBOBOX
}
}
+// return the value in the text control
+wxString wxGridCellChoiceEditor::GetValue() const
+{
+ return Combo()->GetValue();
+}
+
#endif // wxUSE_COMBOBOX
// ----------------------------------------------------------------------------
{
dc.SetBackgroundMode( wxSOLID );
- if ( isSelected )
+ // grey out fields if the grid is disabled
+ if( grid.IsEnabled() )
{
- dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
- }
+ if ( isSelected )
+ {
+ dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
+ }
+ else
+ {
+ dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
+ }
+ }
else
{
- dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
+ dc.SetBrush(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE), wxSOLID));
}
dc.SetPen( *wxTRANSPARENT_PEN );
// TODO some special colours for attr.IsReadOnly() case?
- if ( isSelected )
+ // different coloured text when the grid is disabled
+ if( grid.IsEnabled() )
{
- dc.SetTextBackground( grid.GetSelectionBackground() );
- dc.SetTextForeground( grid.GetSelectionForeground() );
+ if ( isSelected )
+ {
+ dc.SetTextBackground( grid.GetSelectionBackground() );
+ dc.SetTextForeground( grid.GetSelectionForeground() );
+ }
+ else
+ {
+ dc.SetTextBackground( attr.GetBackgroundColour() );
+ dc.SetTextForeground( attr.GetTextColour() );
+ }
}
else
{
- dc.SetTextBackground( attr.GetBackgroundColour() );
- dc.SetTextForeground( attr.GetTextColour() );
+ dc.SetTextBackground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE));
+ dc.SetTextForeground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_GRAYTEXT));
}
dc.SetFont( attr.GetFont() );
}
// draw a border around checkmark
+ int vAlign, hAlign;
+ attr.GetAlignment(& hAlign, &vAlign);
+
wxRect rectBorder;
- rectBorder.x = rect.x + rect.width/2 - size.x/2;
- rectBorder.y = rect.y + rect.height/2 - size.y/2;
- rectBorder.width = size.x;
- rectBorder.height = size.y;
+ if (hAlign == wxALIGN_CENTRE)
+ {
+ rectBorder.x = rect.x + rect.width/2 - size.x/2;
+ rectBorder.y = rect.y + rect.height/2 - size.y/2;
+ rectBorder.width = size.x;
+ rectBorder.height = size.y;
+ }
+ else if (hAlign == wxALIGN_LEFT)
+ {
+ rectBorder.x = rect.x + 2;
+ rectBorder.y = rect.y + rect.height/2 - size.y/2;
+ rectBorder.width = size.x;
+ rectBorder.height = size.y;
+ }
+ else if (hAlign == wxALIGN_RIGHT)
+ {
+ rectBorder.x = rect.x + rect.width - size.x - 2;
+ rectBorder.y = rect.y + rect.height/2 - size.y/2;
+ rectBorder.width = size.x;
+ rectBorder.height = size.y;
+ }
bool value;
if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) )
int client_width = 0;
GetClientSize( &client_width, &client_height );
- dc.SetPen( *wxBLACK_PEN );
+ dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),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.SetPen( *wxWHITE_PEN );
dc.DrawLine( 0, 0, client_width, 0 );
dc.DrawLine( 0, 0, 0, client_height );
+
+ dc.SetPen( *wxWHITE_PEN );
+ dc.DrawLine( 1, 1, client_width-1, 1 );
+ dc.DrawLine( 1, 1, 1, client_height-1 );
}
wxGridWindow::wxGridWindow( wxGrid *parent,
wxGridRowLabelWindow *rowLblWin,
wxGridColLabelWindow *colLblWin,
- wxWindowID id, const wxPoint &pos, const wxSize &size )
- : wxWindow( parent, id, pos, size, wxWANTS_CHARS, wxT("grid window") )
+ wxWindowID id,
+ const wxPoint &pos,
+ const wxSize &size )
+ : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxCLIP_CHILDREN,
+ wxT("grid window") )
+
{
m_owner = parent;
m_rowLabelWin = rowLblWin;
// TODO: something better than this ?
//
m_labelFont = this->GetFont();
- m_labelFont.SetWeight( m_labelFont.GetWeight() + 2 );
+// m_labelFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+// m_labelFont.SetWeight( m_labelFont.GetWeight() + 2 );
- m_rowLabelHorizAlign = wxALIGN_LEFT;
+ m_rowLabelHorizAlign = wxALIGN_CENTRE;
m_rowLabelVertAlign = wxALIGN_CENTRE;
m_colLabelHorizAlign = wxALIGN_CENTRE;
- m_colLabelVertAlign = wxALIGN_TOP;
+ m_colLabelVertAlign = wxALIGN_CENTRE;
m_defaultColWidth = WXGRID_DEFAULT_COL_WIDTH;
m_defaultRowHeight = m_gridWin->GetCharHeight();
m_defaultRowHeight += 4;
#endif
- m_gridLineColour = wxColour( 128, 128, 255 );
+ m_gridLineColour = wxColour( 192,192,192 );
m_gridLinesEnabled = TRUE;
- m_cellHighlightColour = m_gridLineColour;
+ m_cellHighlightColour = *wxBLACK;
m_cellHighlightPenWidth = 2;
m_cellHighlightROPenWidth = 1;
m_selectingTopLeft = wxGridNoCellCoords;
m_selectingBottomRight = wxGridNoCellCoords;
- m_selectionBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
- m_selectionForeground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
+// m_selectionBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
+// m_selectionForeground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
+ m_selectionBackground = *wxBLACK;
+ m_selectionForeground = *wxWHITE;
m_editable = TRUE; // default for whole grid
int w = m_numCols > 0 ? GetColRight(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
+ if( IsCellEditControlShown() )
+ {
+ int w2, h2;
+ int r = m_currentCellCoords.GetRow();
+ int c = m_currentCellCoords.GetCol();
+ int x = GetColLeft(c);
+ int y = GetRowTop(r);
+
+ // how big is the editor
+ wxGridCellAttr* attr = GetCellAttr(r, c);
+ wxGridCellEditor* editor = attr->GetEditor(this, r, c);
+ editor->GetControl()->GetSize(&w2, &h2);
+ w2 += x;
+ h2 += y;
+ if( w2 > w ) w = w2;
+ if( h2 > h ) h = h2;
+ editor->DecRef();
+ attr->DecRef();
+ }
+
// preserve (more or less) the previous position
int x, y;
GetViewStart( &x, &y );
DisableCellEditControl();
MakeCellVisible( coords );
- // if this is the second click on this cell then start
- // the edit control
- if ( m_waitForSlowClick &&
- (coords == m_currentCellCoords) &&
- CanEnableCellControl())
+ if ( event.ControlDown() )
{
- EnableCellEditControl();
-
- wxGridCellAttr* attr = GetCellAttr(m_currentCellCoords);
- wxGridCellEditor *editor = attr->GetEditor(this,
- coords.GetRow(),
- coords.GetCol());
- editor->StartingClick();
- editor->DecRef();
- attr->DecRef();
-
- m_waitForSlowClick = FALSE;
+ if ( m_selection )
+ {
+ m_selection->ToggleCellSelection( coords.GetRow(),
+ coords.GetCol(),
+ event.ControlDown(),
+ event.ShiftDown(),
+ event.AltDown(),
+ event.MetaDown() );
+ }
+ m_selectingTopLeft = wxGridNoCellCoords;
+ m_selectingBottomRight = wxGridNoCellCoords;
+ m_selectingKeyboard = coords;
}
else
{
- if ( event.ControlDown() )
+ m_waitForSlowClick = m_currentCellCoords == coords && coords != wxGridNoCellCoords;
+ SetCurrentCell( coords );
+ if ( m_selection )
{
- if ( m_selection )
+ if ( m_selection->GetSelectionMode() !=
+ wxGrid::wxGridSelectCells )
{
- m_selection->ToggleCellSelection( coords.GetRow(),
- coords.GetCol(),
- event.ControlDown(),
- event.ShiftDown(),
- event.AltDown(),
- event.MetaDown() );
+ HighlightBlock( coords, coords );
}
- m_selectingTopLeft = wxGridNoCellCoords;
- m_selectingBottomRight = wxGridNoCellCoords;
- m_selectingKeyboard = coords;
}
- else
- {
- SetCurrentCell( coords );
- if ( m_selection )
- {
- if ( m_selection->GetSelectionMode() !=
- wxGrid::wxGridSelectCells )
- {
- HighlightBlock( coords, coords );
- }
- }
- }
- m_waitForSlowClick = TRUE;
}
}
}
m_selectingTopLeft = wxGridNoCellCoords;
m_selectingBottomRight = wxGridNoCellCoords;
- }
- // Show the edit control, if it has been hidden for
- // drag-shrinking.
- ShowCellEditControl();
+ // Show the edit control, if it has been hidden for
+ // drag-shrinking.
+ ShowCellEditControl();
+ }
+ else
+ {
+ if( m_waitForSlowClick && CanEnableCellControl())
+ {
+ EnableCellEditControl();
+
+ wxGridCellAttr* attr = GetCellAttr(coords);
+ wxGridCellEditor *editor = attr->GetEditor(this, coords.GetRow(), coords.GetCol());
+ editor->StartingClick();
+ editor->DecRef();
+ attr->DecRef();
+
+ m_waitForSlowClick = FALSE;
+ }
+ }
}
else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW )
{
if ( (event.KeyCode() == WXK_F2 && !event.HasModifiers())
|| editor->IsAcceptedKey(event) )
{
+ // ensure cell is visble
+ MakeCellVisible(row, col);
EnableCellEditControl();
- // the editor could be not shown for a variety of
- // reasons (i.e. blocked by the app or whatever), so
- // check if it really was created
- if ( m_cellEditCtrlEnabled )
- {
- editor->StartingKey(event);
- }
+ // a problem can arise if the cell is not completely
+ // visible (even after calling MakeCellVisible the
+ // control is not created and calling StartingKey will
+ // crash the app
+ if( editor->IsCreated() && m_cellEditCtrlEnabled ) editor->StartingKey(event);
}
else
{
// Now draw the rectangle
- dc.SetPen(wxPen(m_cellHighlightColour, penWidth, wxSOLID));
+ // use the cellHighlightColour if the cell is inside a selection, this
+ // will ensure the cell is always visible.
+ dc.SetPen(wxPen(IsInSelection(row,col)?m_selectionForeground:m_cellHighlightColour, penWidth, wxSOLID));
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.DrawRectangle(rect);
}
int rowTop = GetRowTop(row),
rowBottom = GetRowBottom(row) - 1;
- dc.SetPen( *wxBLACK_PEN );
+ dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) );
dc.DrawLine( m_rowLabelWidth-1, rowTop,
m_rowLabelWidth-1, rowBottom );
- dc.DrawLine( 0, rowBottom, m_rowLabelWidth-1, rowBottom );
+ dc.DrawLine( 0, rowTop, 0, rowBottom );
+
+ dc.DrawLine( 0, rowBottom, m_rowLabelWidth, rowBottom );
dc.SetPen( *wxWHITE_PEN );
- dc.DrawLine( 0, rowTop, 0, rowBottom );
- dc.DrawLine( 0, rowTop, m_rowLabelWidth-1, rowTop );
+ dc.DrawLine( 1, rowTop, 1, rowBottom );
+ dc.DrawLine( 1, rowTop, m_rowLabelWidth-1, rowTop );
dc.SetBackgroundMode( wxTRANSPARENT );
dc.SetTextForeground( GetLabelTextColour() );
int colLeft = GetColLeft(col),
colRight = GetColRight(col) - 1;
- dc.SetPen( *wxBLACK_PEN );
+ dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) );
dc.DrawLine( colRight, 0,
colRight, m_colLabelHeight-1 );
+ dc.DrawLine( colLeft, 0, colRight, 0 );
+
dc.DrawLine( colLeft, m_colLabelHeight-1,
- colRight, m_colLabelHeight-1 );
+ colRight+1, m_colLabelHeight-1 );
dc.SetPen( *wxWHITE_PEN );
- dc.DrawLine( colLeft, 0, colLeft, m_colLabelHeight-1 );
- dc.DrawLine( colLeft, 0, colRight, 0 );
+ dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight-1 );
+ dc.DrawLine( colLeft, 1, colRight, 1 );
dc.SetBackgroundMode( wxTRANSPARENT );
dc.SetTextForeground( GetLabelTextColour() );
{
long textWidth, textHeight;
long lineWidth, lineHeight;
+ int nLines;
dc.SetClippingRegion( rect );
- if ( lines.GetCount() )
+
+ nLines = lines.GetCount();
+ if( nLines > 0 )
{
- GetTextBoxSize( dc, lines, &textWidth, &textHeight );
- dc.GetTextExtent( lines[0], &lineWidth, &lineHeight );
+ int l;
+ float x, y;
+ GetTextBoxSize(dc, lines, &textWidth, &textHeight);
+ switch( vertAlign )
+ {
+ case wxALIGN_BOTTOM:
+ y = rect.y + (rect.height - textHeight - 1);
+ break;
- float x, y;
- switch ( horizAlign )
- {
- case wxALIGN_RIGHT:
- x = rect.x + (rect.width - textWidth - 1);
- break;
+ case wxALIGN_CENTRE:
+ y = rect.y + ((rect.height - textHeight)/2);
+ break;
- case wxALIGN_CENTRE:
- x = rect.x + ((rect.width - textWidth)/2);
- break;
+ case wxALIGN_TOP:
+ default:
+ y = rect.y + 1;
+ break;
+ }
- case wxALIGN_LEFT:
- default:
- x = rect.x + 1;
- break;
- }
+ // Align each line of a multi-line label
+ for( l = 0; l < nLines; l++ )
+ {
+ dc.GetTextExtent(lines[l], &lineWidth, &lineHeight);
- switch ( vertAlign )
+ switch( horizAlign )
{
- case wxALIGN_BOTTOM:
- y = rect.y + (rect.height - textHeight - 1);
- break;
+ case wxALIGN_RIGHT:
+ x = rect.x + (rect.width - lineWidth - 1);
+ break;
- case wxALIGN_CENTRE:
- y = rect.y + ((rect.height - textHeight)/2);
- break;
+ case wxALIGN_CENTRE:
+ x = rect.x + ((rect.width - lineWidth)/2);
+ break;
- case wxALIGN_TOP:
- default:
- y = rect.y + 1;
- break;
+ case wxALIGN_LEFT:
+ default:
+ x = rect.x + 1;
+ break;
}
- for ( size_t i = 0; i < lines.GetCount(); i++ )
- {
- dc.DrawText( lines[i], (int)x, (int)y );
- y += lineHeight;
- }
+ dc.DrawText( lines[l], (int)x, (int)y );
+ y += lineHeight;
+ }
}
-
dc.DestroyClippingRegion();
}
GetEventHandler()->ProcessEvent(evt);
}
- editor->Show( TRUE, attr );
// resize editor to overflow into righthand cells if allowed
int maxWidth = rect.width;
if (rect.GetRight() > client_right)
rect.SetRight(client_right-1);
}
+
+ editor->SetCellAttr(attr);
editor->SetSize( rect );
+ editor->Show( TRUE, attr );
+
+ // recalc dimensions in case we need to
+ // expand the scrolled window to account for editor
+ CalcDimensions();
editor->BeginEdit(row, col, this);
+ editor->SetCellAttr(NULL);
editor->DecRef();
attr->DecRef();
}
else if ( right > cw )
{
- int w = r.GetWidth();
- xpos = r.GetLeft();
- for ( i = col-1; i >= 0; i-- )
- {
- int colWidth = GetColWidth(i);
- if ( w + colWidth > cw )
- break;
-
- w += colWidth;
- xpos -= colWidth;
- }
+ // position the view so that the cell is on the right
+ int x0, y0;
+ CalcUnscrolledPosition(0, 0, &x0, &y0);
+ xpos = x0 + (right - cw);
// see comment for ypos above
xpos += GRID_SCROLL_LINE_X;
InitColWidths();
}
+ // if < 0 calc new width from label
+ if( width < 0 )
+ {
+ long w, h;
+ wxArrayString lines;
+ wxClientDC dc(m_colLabelWin);
+ dc.SetFont(GetLabelFont());
+ StringToLines(GetColLabelValue(col), lines);
+ GetTextBoxSize(dc, lines, &w, &h);
+ width = w + 6;
+ }
int w = wxMax( 0, width );
int diff = w - m_colWidths[col];
m_colWidths[col] = w;