int additionalStyle = 0,
const wxString& name = wxPanelNameStr)
: wxWindow(owner, id, pos, size,
- wxWANTS_CHARS | wxBORDER_NONE | additionalStyle,
+ wxBORDER_NONE | additionalStyle,
name)
{
m_owner = owner;
}
+ virtual bool AcceptsFocus() const { return false; }
+
wxGrid *GetOwner() { return m_owner; }
protected:
void OnPaint( wxPaintEvent& event );
void OnMouseEvent( wxMouseEvent& event );
void OnMouseWheel( wxMouseEvent& event );
- void OnKeyDown( wxKeyEvent& event );
- void OnKeyUp( wxKeyEvent& );
- void OnChar( wxKeyEvent& );
DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow)
DECLARE_EVENT_TABLE()
void OnPaint( wxPaintEvent& event );
void OnMouseEvent( wxMouseEvent& event );
void OnMouseWheel( wxMouseEvent& event );
- void OnKeyDown( wxKeyEvent& event );
- void OnKeyUp( wxKeyEvent& );
- void OnChar( wxKeyEvent& );
DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow)
DECLARE_EVENT_TABLE()
private:
void OnMouseEvent( wxMouseEvent& event );
void OnMouseWheel( wxMouseEvent& event );
- void OnKeyDown( wxKeyEvent& event );
- void OnKeyUp( wxKeyEvent& );
- void OnChar( wxKeyEvent& );
void OnPaint( wxPaintEvent& event );
DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow)
void ScrollWindow( int dx, int dy, const wxRect *rect );
+ virtual bool AcceptsFocus() const { return true; }
+
private:
wxGridRowLabelWindow *m_rowLabelWin;
wxGridColLabelWindow *m_colLabelWin;
gridWindow->GetOwner()->PrepareDC(dc);
dc.SetPen(*wxTRANSPARENT_PEN);
- dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
+ dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxBRUSHSTYLE_SOLID));
dc.DrawRectangle(rectCell);
// redraw the control we just painted over
wxWindowID id,
wxEvtHandler* evtHandler)
{
- int style = wxBORDER_NONE;
- if (!m_allowOthers)
+ int style = wxTE_PROCESS_ENTER |
+ wxTE_PROCESS_TAB |
+ wxBORDER_NONE;
+
+ if ( !m_allowOthers )
style |= wxCB_READONLY;
m_control = new wxComboBox(parent, id, wxEmptyString,
wxDefaultPosition, wxDefaultSize,
- m_choices, style );
+ m_choices,
+ style);
wxGridCellEditor::Create(parent, id, evtHandler);
}
int WXUNUSED(row), int WXUNUSED(col),
bool isSelected)
{
- dc.SetBackgroundMode( wxSOLID );
+ dc.SetBackgroundMode( wxBRUSHSTYLE_SOLID );
// grey out fields if the grid is disabled
if ( grid.IsEnabled() )
{
if ( isSelected )
{
- dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
+ wxColour clr;
+ if ( grid.HasFocus() )
+ clr = grid.GetSelectionBackground();
+ else
+ clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+ dc.SetBrush( wxBrush(clr, wxBRUSHSTYLE_SOLID) );
}
else
{
- dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
+ dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxBRUSHSTYLE_SOLID) );
}
}
else
{
- dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), wxSOLID));
+ dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), wxBRUSHSTYLE_SOLID));
}
dc.SetPen( *wxTRANSPARENT_PEN );
wxDC& dc,
bool isSelected)
{
- dc.SetBackgroundMode( wxTRANSPARENT );
+ dc.SetBackgroundMode( wxBRUSHSTYLE_TRANSPARENT );
// TODO some special colours for attr.IsReadOnly() case?
{
if ( isSelected )
{
- dc.SetTextBackground( grid.GetSelectionBackground() );
+ wxColour clr;
+ if ( grid.HasFocus() )
+ clr = grid.GetSelectionBackground();
+ else
+ clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+ dc.SetTextBackground( clr );
dc.SetTextForeground( grid.GetSelectionForeground() );
}
else
EVT_PAINT( wxGridRowLabelWindow::OnPaint )
EVT_MOUSEWHEEL( wxGridRowLabelWindow::OnMouseWheel )
EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent )
- EVT_KEY_DOWN( wxGridRowLabelWindow::OnKeyDown )
- EVT_KEY_UP( wxGridRowLabelWindow::OnKeyUp )
- EVT_CHAR( wxGridRowLabelWindow::OnChar )
END_EVENT_TABLE()
wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent,
m_owner->GetEventHandler()->ProcessEvent( event );
}
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridRowLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
-void wxGridRowLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
-void wxGridRowLabelWindow::OnChar( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC_CLASS( wxGridColLabelWindow, wxWindow )
EVT_PAINT( wxGridColLabelWindow::OnPaint )
EVT_MOUSEWHEEL( wxGridColLabelWindow::OnMouseWheel )
EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent )
- EVT_KEY_DOWN( wxGridColLabelWindow::OnKeyDown )
- EVT_KEY_UP( wxGridColLabelWindow::OnKeyUp )
- EVT_CHAR( wxGridColLabelWindow::OnChar )
END_EVENT_TABLE()
wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent,
m_owner->GetEventHandler()->ProcessEvent( event );
}
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridColLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
-void wxGridColLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
-void wxGridColLabelWindow::OnChar( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC_CLASS( wxGridCornerLabelWindow, wxWindow )
EVT_MOUSEWHEEL( wxGridCornerLabelWindow::OnMouseWheel )
EVT_MOUSE_EVENTS( wxGridCornerLabelWindow::OnMouseEvent )
EVT_PAINT( wxGridCornerLabelWindow::OnPaint )
- EVT_KEY_DOWN( wxGridCornerLabelWindow::OnKeyDown )
- EVT_KEY_UP( wxGridCornerLabelWindow::OnKeyUp )
- EVT_CHAR( wxGridCornerLabelWindow::OnChar )
END_EVENT_TABLE()
wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent,
wxRendererNative::Get().DrawHeaderButton( this, dc, rect, 0 );
#else // !__WXGTK__
- dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) );
+ dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxPENSTYLE_SOLID) );
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 );
m_owner->GetEventHandler()->ProcessEvent(event);
}
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridCornerLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
-void wxGridCornerLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
-void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event )
-{
- if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
- event.Skip();
-}
-
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC_CLASS( wxGridWindow, wxWindow )
const wxPoint &pos,
const wxSize &size )
: wxGridSubwindow(parent, id, pos, size,
- wxCLIP_CHILDREN, wxT("grid window") )
+ wxWANTS_CHARS | wxCLIP_CHILDREN,
+ wxT("grid window") )
{
m_owner = parent;
m_rowLabelWin = rowLblWin;
void wxGridWindow::OnFocus(wxFocusEvent& event)
{
+ // and if we have any selection, it has to be repainted, because it
+ // uses different colour when the grid is not focused:
+ if ( m_owner->IsSelection() )
+ {
+ Refresh();
+ }
+ else
+ {
+ // NB: Note that this code is in "else" branch only because the other
+ // branch refreshes everything and so there's no point in calling
+ // Refresh() again, *not* because it should only be done if
+ // !IsSelection(). If the above code is ever optimized to refresh
+ // only selected area, this needs to be moved out of the "else"
+ // branch so that it's always executed.
+
+ // current cell cursor {dis,re}appears on focus change:
+ const wxGridCellCoords cursorCoords(m_owner->GetGridCursorRow(),
+ m_owner->GetGridCursorCol());
+ const wxRect cursor =
+ m_owner->BlockToDeviceRect(cursorCoords, cursorCoords);
+ Refresh(true, &cursor);
+ }
+
if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
event.Skip();
}
wxGrid::wxGrid()
{
- // in order to make sure that a size event is not
- // trigerred in a unfinished state
- m_cornerLabelWin = NULL;
- m_rowLabelWin = NULL;
- m_colLabelWin = NULL;
- m_gridWin = NULL;
+ InitVars();
}
wxGrid::wxGrid( wxWindow *parent,
const wxSize& size,
long style,
const wxString& name )
- : wxScrolledWindow( parent, id, pos, size, (style | wxWANTS_CHARS), name ),
- m_colMinWidths(GRID_HASH_SIZE),
- m_rowMinHeights(GRID_HASH_SIZE)
{
- Create();
- SetInitialSize(size);
+ InitVars();
+ Create(parent, id, pos, size, style, name);
}
bool wxGrid::Create(wxWindow *parent, wxWindowID id,
void wxGrid::Create()
{
- // set to true by CreateGrid
- m_created = false;
-
// create the type registry
m_typeRegistry = new wxGridTypeRegistry;
- m_selection = NULL;
-
- m_table = (wxGridTableBase *) NULL;
- m_ownTable = false;
m_cellEditCtrlEnabled = false;
return m_created;
}
+void wxGrid::InitVars()
+{
+ m_created = false;
+
+ m_cornerLabelWin = NULL;
+ m_rowLabelWin = NULL;
+ m_colLabelWin = NULL;
+ m_gridWin = NULL;
+
+ m_table = NULL;
+ m_ownTable = false;
+
+ m_selection = NULL;
+ m_defaultCellAttr = NULL;
+ m_typeRegistry = NULL;
+ m_winCapture = NULL;
+}
+
void wxGrid::Init()
{
m_rowLabelWidth = WXGRID_DEFAULT_ROW_LABEL_WIDTH;
}
}
+ // the grid may be too small to have enough space for the labels yet, don't
+ // size the windows to negative sizes in this case
+ int gw = cw - m_rowLabelWidth;
+ int gh = ch - m_colLabelHeight;
+ if (gw < 0)
+ gw = 0;
+ if (gh < 0)
+ gh = 0;
+
if ( m_cornerLabelWin && m_cornerLabelWin->IsShown() )
m_cornerLabelWin->SetSize( 0, 0, m_rowLabelWidth, m_colLabelHeight );
if ( m_colLabelWin && m_colLabelWin->IsShown() )
- m_colLabelWin->SetSize( m_rowLabelWidth, 0, cw - m_rowLabelWidth, m_colLabelHeight );
+ m_colLabelWin->SetSize( m_rowLabelWidth, 0, gw, m_colLabelHeight );
if ( m_rowLabelWin && m_rowLabelWin->IsShown() )
- m_rowLabelWin->SetSize( 0, m_colLabelHeight, m_rowLabelWidth, ch - m_colLabelHeight );
+ m_rowLabelWin->SetSize( 0, m_colLabelHeight, m_rowLabelWidth, gh );
if ( m_gridWin && m_gridWin->IsShown() )
- m_gridWin->SetSize( m_rowLabelWidth, m_colLabelHeight, cw - m_rowLabelWidth, ch - m_colLabelHeight );
+ m_gridWin->SetSize( m_rowLabelWidth, m_colLabelHeight, gw, gh );
}
// this is called when the grid table sends a message
{
// Don't do anything if between Begin/EndBatch...
// EndBatch() will do all this on the last nested one anyway.
- if (! GetBatchCount())
+ if ( m_created && !GetBatchCount() )
{
// Refresh to get correct scrolled position:
wxScrolledWindow::Refresh(eraseb, rect);
int left, top;
CalcUnscrolledPosition( 0, 0, &left, &top );
- dc.SetBrush( wxBrush(GetDefaultCellBackgroundColour(), wxSOLID) );
+ dc.SetBrush( wxBrush(GetDefaultCellBackgroundColour(), wxBRUSHSTYLE_SOLID) );
dc.SetPen( *wxTRANSPARENT_PEN );
if ( right > rightCol )
void wxGrid::DrawCellHighlight( wxDC& dc, const wxGridCellAttr *attr )
{
+ // don't show highlight when the grid doesn't have focus
+ if ( !HasFocus() )
+ return;
+
int row = m_currentCellCoords.GetRow();
int col = m_currentCellCoords.GetCol();
// Now draw the rectangle
// 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.SetPen(wxPen(IsInSelection(row,col) ? m_selectionForeground : m_cellHighlightColour, penWidth, wxPENSTYLE_SOLID));
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.DrawRectangle(rect);
}
wxPen wxGrid::GetDefaultGridLinePen()
{
- return wxPen(GetGridLineColour(), 1, wxSOLID);
+ return wxPen(GetGridLineColour(), 1, wxPENSTYLE_SOLID);
}
wxPen wxGrid::GetRowGridLinePen(int WXUNUSED(row))
int rowTop = GetRowTop(row),
rowBottom = GetRowBottom(row) - 1;
- dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) );
+ dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxPENSTYLE_SOLID) );
dc.DrawLine( m_rowLabelWidth - 1, rowTop, m_rowLabelWidth - 1, rowBottom );
dc.DrawLine( 0, rowTop, 0, rowBottom );
dc.DrawLine( 0, rowBottom, m_rowLabelWidth, rowBottom );
dc.DrawLine( 1, rowTop, 1, rowBottom );
dc.DrawLine( 1, rowTop, m_rowLabelWidth - 1, rowTop );
- dc.SetBackgroundMode( wxTRANSPARENT );
+ dc.SetBackgroundMode( wxBRUSHSTYLE_TRANSPARENT );
dc.SetTextForeground( GetLabelTextColour() );
dc.SetFont( GetLabelFont() );
{
int colRight = GetColRight(col) - 1;
- dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) );
+ dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxPENSTYLE_SOLID) );
dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 );
dc.DrawLine( colLeft, 0, colRight, 0 );
dc.DrawLine( colLeft, m_colLabelHeight - 1,
dc.DrawLine( colLeft, 1, colRight, 1 );
}
- dc.SetBackgroundMode( wxTRANSPARENT );
+ dc.SetBackgroundMode( wxBRUSHSTYLE_TRANSPARENT );
dc.SetTextForeground( GetLabelTextColour() );
dc.SetFont( GetLabelFont() );
// Split multi-line text up into an array of strings.
// Any existing contents of the string array are preserved.
//
+// TODO: refactor wxTextFile::Read() and reuse the same code from here
void wxGrid::StringToLines( const wxString& value, wxArrayString& lines ) const
{
int startPos = 0;
}
else
{
- lines.Add( value.Mid(startPos, pos) );
+ lines.Add( tVal.Mid(startPos, pos) );
}
startPos += pos + 1;
}
- if ( startPos < (int)value.length() )
+ if ( startPos < (int)tVal.length() )
{
- lines.Add( value.Mid( startPos ) );
+ lines.Add( tVal.Mid( startPos ) );
}
}
wxClientDC dc( m_gridWin );
PrepareDC( dc );
wxGridCellAttr* attr = GetCellAttr(row, col);
- dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
+ dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxBRUSHSTYLE_SOLID));
dc.SetPen(*wxTRANSPARENT_PEN);
dc.DrawRectangle(rect);
return rect;
}
+// ----------------------------------------------------------------------------
+// drop target
+// ----------------------------------------------------------------------------
+
+#if wxUSE_DRAG_AND_DROP
+
+// this allow setting drop target directly on wxGrid
+void wxGrid::SetDropTarget(wxDropTarget *dropTarget)
+{
+ GetGridWindow()->SetDropTarget(dropTarget);
+}
+
+#endif // wxUSE_DRAG_AND_DROP
+
// ----------------------------------------------------------------------------
// grid event classes
// ----------------------------------------------------------------------------