#include "wx/textfile.h"
#include "wx/spinctrl.h"
#include "wx/tokenzr.h"
+#include "wx/renderer.h"
#include "wx/grid.h"
#include "wx/generic/gridsel.h"
void OnMouseWheel( wxMouseEvent& event );
void OnKeyDown( wxKeyEvent& event );
void OnKeyUp( wxKeyEvent& );
+ void OnChar( wxKeyEvent& );
DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow)
DECLARE_EVENT_TABLE()
void OnMouseWheel( wxMouseEvent& event );
void OnKeyDown( wxKeyEvent& event );
void OnKeyUp( wxKeyEvent& );
+ void OnChar( wxKeyEvent& );
DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow)
DECLARE_EVENT_TABLE()
void OnMouseWheel( wxMouseEvent& event );
void OnKeyDown( wxKeyEvent& event );
void OnKeyUp( wxKeyEvent& );
+ void OnChar( wxKeyEvent& );
void OnPaint( wxPaintEvent& event );
DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow)
wxGridRowLabelWindow *rowLblWin,
wxGridColLabelWindow *colLblWin,
wxWindowID id, const wxPoint &pos, const wxSize &size );
- ~wxGridWindow();
+ ~wxGridWindow(){}
void ScrollWindow( int dx, int dy, const wxRect *rect );
void OnMouseEvent( wxMouseEvent& event );
void OnKeyDown( wxKeyEvent& );
void OnKeyUp( wxKeyEvent& );
+ void OnChar( wxKeyEvent& );
void OnEraseBackground( wxEraseEvent& );
void OnFocus( wxFocusEvent& );
m_colBgOld = m_control->GetBackgroundColour();
m_control->SetBackgroundColour(attr->GetBackgroundColour());
+// Workaround for GTK+1 font setting problem on some platforms
+#if !defined(__WXGTK__) || defined(__WXGTK20__)
m_fontOld = m_control->GetFont();
m_control->SetFont(attr->GetFont());
-
+#endif
// can't do anything more in the base class version, the other
// attributes may only be used by the derived classes
}
m_control->SetBackgroundColour(m_colBgOld);
m_colBgOld = wxNullColour;
}
-
+// Workaround for GTK+1 font setting problem on some platforms
+#if !defined(__WXGTK__) || defined(__WXGTK20__)
if ( m_fontOld.Ok() )
{
m_control->SetFont(m_fontOld);
m_fontOld = wxNullFont;
}
+#endif
}
}
bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event)
{
- // accept the simple key presses, not anything with Ctrl/Alt/Meta
- return !(event.ControlDown() || event.AltDown());
+ bool ctrl = event.ControlDown();
+ bool alt = event.AltDown();
+#ifdef __WXMAC__
+ // On the Mac the Alt key is more like shift and is used for entry of
+ // valid characters, so check for Ctrl and Meta instead.
+ alt = event.MetaDown();
+#endif
+
+ // Assume it's not a valid char if ctrl or alt is down, but if both are
+ // down then it may be because of an AltGr key combination, so let them
+ // through in that case.
+ if ((ctrl || alt) && !(ctrl && alt))
+ return false;
+
+#if wxUSE_UNICODE
+ int key = event.GetUnicodeKey();
+ bool keyOk = true;
+
+ // if the unicode key code is not really a unicode character (it may
+ // be a function key or etc., the platforms appear to always give us a
+ // small value in this case) then fallback to the ascii key code but
+ // don't do anything for function keys or etc.
+ if (key <= 127)
+ {
+ key = event.GetKeyCode();
+ keyOk = (key <= 127);
+ }
+ return keyOk;
+#else // !wxUSE_UNICODE
+ int key = event.GetKeyCode();
+ if (key <= 255)
+ return true;
+ return false;
+#endif // wxUSE_UNICODE/!wxUSE_UNICODE
}
void wxGridCellEditor::StartingKey(wxKeyEvent& event)
bool wxGridCellTextEditor::IsAcceptedKey(wxKeyEvent& event)
{
- if ( wxGridCellEditor::IsAcceptedKey(event) )
- {
- int keycode = event.GetKeyCode();
- switch ( keycode )
- {
- case WXK_NUMPAD0:
- case WXK_NUMPAD1:
- case WXK_NUMPAD2:
- case WXK_NUMPAD3:
- case WXK_NUMPAD4:
- case WXK_NUMPAD5:
- case WXK_NUMPAD6:
- case WXK_NUMPAD7:
- case WXK_NUMPAD8:
- case WXK_NUMPAD9:
- case WXK_MULTIPLY:
- case WXK_NUMPAD_MULTIPLY:
- case WXK_ADD:
- case WXK_NUMPAD_ADD:
- case WXK_SUBTRACT:
- case WXK_NUMPAD_SUBTRACT:
- case WXK_DECIMAL:
- case WXK_NUMPAD_DECIMAL:
- case WXK_DIVIDE:
- case WXK_NUMPAD_DIVIDE:
- return true;
-
- default:
- // accept 8 bit chars too if isprint() agrees
- if ( (keycode < 255) && (wxIsprint(keycode)) )
- return true;
- }
- }
-
- return false;
+ return wxGridCellEditor::IsAcceptedKey(event);
}
void wxGridCellTextEditor::StartingKey(wxKeyEvent& event)
{
- if ( !Text()->EmulateKeyPress(event) )
+ // Since this is now happening in the EVT_CHAR event EmulateKeyPress is no
+ // longer an appropriate way to get the character into the text control.
+ // Do it ourselves instead. We know that if we get this far that we have
+ // a valid character, so not a whole lot of testing needs to be done.
+
+ wxTextCtrl* tc = Text();
+ wxChar ch;
+ long pos;
+
+#if wxUSE_UNICODE
+ ch = event.GetUnicodeKey();
+ if (ch <= 127)
+ ch = (wxChar)event.GetKeyCode();
+#else
+ ch = (wxChar)event.GetKeyCode();
+#endif
+ switch (ch)
{
- event.Skip();
+ case WXK_DELETE:
+ // delete the character at the cursor
+ pos = tc->GetInsertionPoint();
+ if (pos < tc->GetLastPosition())
+ tc->Remove(pos, pos+1);
+ break;
+
+ case WXK_BACK:
+ // delete the character before the cursor
+ pos = tc->GetInsertionPoint();
+ if (pos > 0)
+ tc->Remove(pos-1, pos);
+ break;
+
+ default:
+ tc->WriteText(ch);
+ break;
}
}
wxWindowID id,
wxEvtHandler* evtHandler)
{
+#if wxUSE_SPINCTRL
if ( HasRange() )
{
// create a spin ctrl
wxGridCellEditor::Create(parent, id, evtHandler);
}
else
+#endif
{
// just a text control
wxGridCellTextEditor::Create(parent, id, evtHandler);
{
m_valueOld = 0;
wxString sValue = table->GetValue(row, col);
- if (! sValue.ToLong(&m_valueOld) && ! sValue.IsEmpty())
+ if (! sValue.ToLong(&m_valueOld) && ! sValue.empty())
{
wxFAIL_MSG( _T("this cell doesn't have numeric value") );
return;
}
}
+#if wxUSE_SPINCTRL
if ( HasRange() )
{
Spin()->SetValue((int)m_valueOld);
Spin()->SetFocus();
}
else
+#endif
{
DoBeginEdit(GetString());
}
long value = 0;
wxString text;
+#if wxUSE_SPINCTRL
if ( HasRange() )
{
value = Spin()->GetValue();
text = wxString::Format(wxT("%ld"), value);
}
else
+#endif
{
text = Text()->GetValue();
- changed = (text.IsEmpty() || text.ToLong(&value)) && (value != m_valueOld);
+ changed = (text.empty() || text.ToLong(&value)) && (value != m_valueOld);
}
if ( changed )
void wxGridCellNumberEditor::Reset()
{
+#if wxUSE_SPINCTRL
if ( HasRange() )
{
Spin()->SetValue((int)m_valueOld);
}
else
+#endif
{
DoReset(GetString());
}
if ( wxGridCellEditor::IsAcceptedKey(event) )
{
int keycode = event.GetKeyCode();
- switch ( keycode )
+ if ( (keycode < 128) &&
+ (wxIsdigit(keycode) || keycode == '+' || keycode == '-'))
{
- case WXK_NUMPAD0:
- case WXK_NUMPAD1:
- case WXK_NUMPAD2:
- case WXK_NUMPAD3:
- case WXK_NUMPAD4:
- case WXK_NUMPAD5:
- case WXK_NUMPAD6:
- case WXK_NUMPAD7:
- case WXK_NUMPAD8:
- case WXK_NUMPAD9:
- case WXK_ADD:
- case WXK_NUMPAD_ADD:
- case WXK_SUBTRACT:
- case WXK_NUMPAD_SUBTRACT:
- case WXK_UP:
- case WXK_DOWN:
- return true;
-
- default:
- if ( (keycode < 128) && wxIsdigit(keycode) )
- return true;
+ return true;
}
}
if ( !HasRange() )
{
int keycode = event.GetKeyCode();
- if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
- || keycode == WXK_NUMPAD0
- || keycode == WXK_NUMPAD1
- || keycode == WXK_NUMPAD2
- || keycode == WXK_NUMPAD3
- || keycode == WXK_NUMPAD4
- || keycode == WXK_NUMPAD5
- || keycode == WXK_NUMPAD6
- || keycode == WXK_NUMPAD7
- || keycode == WXK_NUMPAD8
- || keycode == WXK_NUMPAD9
- || keycode == WXK_ADD
- || keycode == WXK_NUMPAD_ADD
- || keycode == WXK_SUBTRACT
- || keycode == WXK_NUMPAD_SUBTRACT)
+ if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-')
{
wxGridCellTextEditor::StartingKey(event);
// return the value in the spin control if it is there (the text control otherwise)
wxString wxGridCellNumberEditor::GetValue() const
{
- wxString s;
+ wxString s;
- if( HasRange() )
- {
- long value = Spin()->GetValue();
- s.Printf(wxT("%ld"), value);
- }
- else
- {
- s = Text()->GetValue();
- }
- return s;
+#if wxUSE_SPINCTRL
+ if( HasRange() )
+ {
+ long value = Spin()->GetValue();
+ s.Printf(wxT("%ld"), value);
+ }
+ else
+#endif
+ {
+ s = Text()->GetValue();
+ }
+
+ return s;
}
// ----------------------------------------------------------------------------
{
m_valueOld = 0.0;
wxString sValue = table->GetValue(row, col);
- if (! sValue.ToDouble(&m_valueOld) && ! sValue.IsEmpty())
+ if (! sValue.ToDouble(&m_valueOld) && ! sValue.empty())
{
wxFAIL_MSG( _T("this cell doesn't have float value") );
return;
double value = 0.0;
wxString text(Text()->GetValue());
- if ( (text.IsEmpty() || text.ToDouble(&value)) && (value != m_valueOld) )
+ if ( (text.empty() || text.ToDouble(&value)) && (value != m_valueOld) )
{
if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT))
grid->GetTable()->SetValueAsDouble(row, col, value);
tmpbuf[1] = '\0';
wxString strbuf(tmpbuf, *wxConvCurrent);
bool is_decimal_point = ( strbuf ==
- wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) );
- if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
- || is_decimal_point
- || keycode == WXK_NUMPAD0
- || keycode == WXK_NUMPAD1
- || keycode == WXK_NUMPAD2
- || keycode == WXK_NUMPAD3
- || keycode == WXK_NUMPAD4
- || keycode == WXK_NUMPAD5
- || keycode == WXK_NUMPAD6
- || keycode == WXK_NUMPAD7
- || keycode == WXK_NUMPAD8
- || keycode == WXK_NUMPAD9
- || keycode == WXK_ADD
- || keycode == WXK_NUMPAD_ADD
- || keycode == WXK_SUBTRACT
- || keycode == WXK_NUMPAD_SUBTRACT)
+ wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) );
+ if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
+ || is_decimal_point )
{
wxGridCellTextEditor::StartingKey(event);
if ( wxGridCellEditor::IsAcceptedKey(event) )
{
int keycode = event.GetKeyCode();
- switch ( keycode )
- {
- case WXK_NUMPAD0:
- case WXK_NUMPAD1:
- case WXK_NUMPAD2:
- case WXK_NUMPAD3:
- case WXK_NUMPAD4:
- case WXK_NUMPAD5:
- case WXK_NUMPAD6:
- case WXK_NUMPAD7:
- case WXK_NUMPAD8:
- case WXK_NUMPAD9:
- case WXK_ADD:
- case WXK_NUMPAD_ADD:
- case WXK_SUBTRACT:
- case WXK_NUMPAD_SUBTRACT:
- case WXK_DECIMAL:
- case WXK_NUMPAD_DECIMAL:
- return true;
-
- default:
- {
- // additionally accept 'e' as in '1e+6', also '-', '+', and '.'
- char tmpbuf[2];
- tmpbuf[0] = (char) keycode;
- tmpbuf[1] = '\0';
- bool is_decimal_point =
- ( wxString(tmpbuf, *wxConvCurrent) ==
- wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT,
- wxLOCALE_CAT_NUMBER) );
- if ( (keycode < 128) &&
- (wxIsdigit(keycode) || tolower(keycode) == 'e' ||
- is_decimal_point || keycode == '+' || keycode == '-') )
- return true;
- }
- }
+ printf("%d\n", keycode);
+ // accept digits, 'e' as in '1e+6', also '-', '+', and '.'
+ char tmpbuf[2];
+ tmpbuf[0] = (char) keycode;
+ tmpbuf[1] = '\0';
+ wxString strbuf(tmpbuf, *wxConvCurrent);
+ bool is_decimal_point =
+ ( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT,
+ wxLOCALE_CAT_NUMBER) );
+ if ( (keycode < 128) &&
+ (wxIsdigit(keycode) || tolower(keycode) == 'e' ||
+ is_decimal_point || keycode == '+' || keycode == '-') )
+ return true;
}
return false;
int keycode = event.GetKeyCode();
switch ( keycode )
{
- case WXK_MULTIPLY:
- case WXK_NUMPAD_MULTIPLY:
- case WXK_ADD:
- case WXK_NUMPAD_ADD:
- case WXK_SUBTRACT:
- case WXK_NUMPAD_SUBTRACT:
case WXK_SPACE:
case '+':
case '-':
return false;
}
+void wxGridCellBoolEditor::StartingKey(wxKeyEvent& event)
+{
+ int keycode = event.GetKeyCode();
+ switch ( keycode )
+ {
+ case WXK_SPACE:
+ CBox()->SetValue(!CBox()->GetValue());
+ break;
+
+ case '+':
+ CBox()->SetValue(true);
+ break;
+
+ case '-':
+ CBox()->SetValue(false);
+ break;
+ }
+}
+
+
// return the value as "1" for true and the empty string for false
wxString wxGridCellBoolEditor::GetValue() const
{
m_editor->HandleReturn(event);
break;
-
default:
event.Skip();
}
// grey out fields if the grid is disabled
if( grid.IsEnabled() )
{
- if ( isSelected )
- {
- dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
- }
- else
- {
- dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
- }
+ if ( isSelected )
+ {
+ dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
+ }
+ else
+ {
+ dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
+ }
}
else
{
- dc.SetBrush(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE), wxSOLID));
+ dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), wxSOLID));
}
dc.SetPen( *wxTRANSPARENT_PEN );
}
else
{
- dc.SetTextBackground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE));
- dc.SetTextForeground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_GRAYTEXT));
+ dc.SetTextBackground(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
+ dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
}
dc.SetFont( attr.GetFont() );
else
{
wxString tmp = params.BeforeFirst(_T(','));
- if ( !!tmp )
+ if ( !tmp.empty() )
{
long width;
if ( tmp.ToLong(&width) )
}
tmp = params.AfterFirst(_T(','));
- if ( !!tmp )
+ if ( !tmp.empty() )
{
long precision;
if ( tmp.ToLong(&precision) )
else
{
// ...or remove the attribute
- m_attrs.RemoveAt((size_t)n);
+ // No need to DecRef the attribute itself since this is
+ // done be wxGridCellWithAttr's destructor!
+ m_attrs.RemoveAt(n);
n--; count--;
}
}
else
{
// ...or remove the attribute
- m_attrs.RemoveAt((size_t)n);
+ // No need to DecRef the attribute itself since this is
+ // done be wxGridCellWithAttr's destructor!
+ m_attrs.RemoveAt(n);
n--; count--;
}
}
rowOrCol += numRowsOrCols;
else
{
- m_rowsOrCols.RemoveAt((size_t)n);
- m_attrs.RemoveAt((size_t)n);
+ m_rowsOrCols.RemoveAt(n);
+ m_attrs[n]->DecRef();
+ m_attrs.RemoveAt(n);
n--; count--;
}
}
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,
if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
}
+void wxGridRowLabelWindow::OnChar( wxKeyEvent& event )
+{
+ if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
+
//////////////////////////////////////////////////////////////////////
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,
if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
}
+void wxGridColLabelWindow::OnChar( wxKeyEvent& event )
+{
+ if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
//////////////////////////////////////////////////////////////////////
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,
int client_width = 0;
GetClientSize( &client_width, &client_height );
+#if __WXGTK__
+ wxRect rect;
+ rect.SetX( 1 );
+ rect.SetY( 1 );
+ rect.SetWidth( client_width - 2 );
+ rect.SetHeight( client_height - 2 );
+
+ wxRendererNative::Get().DrawHeaderButton( this, dc, rect, 0 );
+#else
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( 1, 1, client_width-1, 1 );
dc.DrawLine( 1, 1, 1, client_height-1 );
+#endif
}
if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
}
+void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event )
+{
+ if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
//////////////////////////////////////////////////////////////////////
EVT_MOUSE_EVENTS( wxGridWindow::OnMouseEvent )
EVT_KEY_DOWN( wxGridWindow::OnKeyDown )
EVT_KEY_UP( wxGridWindow::OnKeyUp )
+ EVT_CHAR ( wxGridWindow::OnChar )
EVT_SET_FOCUS( wxGridWindow::OnFocus )
EVT_KILL_FOCUS( wxGridWindow::OnFocus )
EVT_ERASE_BACKGROUND( wxGridWindow::OnEraseBackground )
}
-wxGridWindow::~wxGridWindow()
-{
-}
-
-
void wxGridWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
{
wxPaintDC dc( this );
if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
}
+void wxGridWindow::OnChar( wxKeyEvent& event )
+{
+ if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) event.Skip();
+}
+
void wxGridWindow::OnEraseBackground( wxEraseEvent& WXUNUSED(event) )
{
}
EVT_SIZE( wxGrid::OnSize )
EVT_KEY_DOWN( wxGrid::OnKeyDown )
EVT_KEY_UP( wxGrid::OnKeyUp )
+ EVT_CHAR ( wxGrid::OnChar )
EVT_ERASE_BACKGROUND( wxGrid::OnEraseBackground )
END_EVENT_TABLE()
rowlabels.Add( row );
}
- iter++ ;
+ ++iter;
}
return rowlabels;
colLabels.Add( col );
}
- iter++ ;
+ ++iter;
}
return colLabels;
}
}
}
- iter++;
+ ++iter;
}
return cellsExposed;
// Otherwise fall through to default
default:
- // is it possible to edit the current cell at all?
- if ( !IsCellEditControlEnabled() && CanEnableCellControl() )
- {
- // yes, now check whether the cells editor accepts the key
- int row = m_currentCellCoords.GetRow();
- int col = m_currentCellCoords.GetCol();
- wxGridCellAttr* attr = GetCellAttr(row, col);
- wxGridCellEditor *editor = attr->GetEditor(this, row, col);
-
- // <F2> is special and will always start editing, for
- // other keys - ask the editor itself
- if ( (event.GetKeyCode() == WXK_F2 && !event.HasModifiers())
- || editor->IsAcceptedKey(event) )
- {
- // ensure cell is visble
- MakeCellVisible(row, col);
- EnableCellEditControl();
-
- // 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
- {
- event.Skip();
- }
-
- editor->DecRef();
- attr->DecRef();
- }
- else
- {
- // let others process char events with modifiers or all
- // char events for readonly cells
- event.Skip();
- }
+ event.Skip();
break;
}
}
}
}
+void wxGrid::OnChar( wxKeyEvent& event )
+{
+ // is it possible to edit the current cell at all?
+ if ( !IsCellEditControlEnabled() && CanEnableCellControl() )
+ {
+ // yes, now check whether the cells editor accepts the key
+ int row = m_currentCellCoords.GetRow();
+ int col = m_currentCellCoords.GetCol();
+ wxGridCellAttr* attr = GetCellAttr(row, col);
+ wxGridCellEditor *editor = attr->GetEditor(this, row, col);
+
+ // <F2> is special and will always start editing, for
+ // other keys - ask the editor itself
+ if ( (event.GetKeyCode() == WXK_F2 && !event.HasModifiers())
+ || editor->IsAcceptedKey(event) )
+ {
+ // ensure cell is visble
+ MakeCellVisible(row, col);
+ EnableCellEditControl();
+
+ // 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
+ {
+ event.Skip();
+ }
+
+ editor->DecRef();
+ attr->DecRef();
+ }
+ else
+ {
+ event.Skip();
+ }
+}
+
+
void wxGrid::OnEraseBackground(wxEraseEvent&)
{
}
if ( GetRowHeight(row) <= 0 )
return;
+ wxRect rect;
+#ifdef __WXGTK__
+ rect.SetX( 1 );
+ rect.SetY( GetRowTop(row) + 1 );
+ rect.SetWidth( m_rowLabelWidth - 2 );
+ rect.SetHeight( GetRowHeight(row) - 2 );
+
+ CalcScrolledPosition( 0, rect.y, NULL, &rect.y );
+
+ wxWindowDC *win_dc = (wxWindowDC*) &dc;
+
+ wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
+#else
int rowTop = GetRowTop(row),
rowBottom = GetRowBottom(row) - 1;
dc.SetPen( *wxWHITE_PEN );
dc.DrawLine( 1, rowTop, 1, rowBottom );
dc.DrawLine( 1, rowTop, m_rowLabelWidth-1, rowTop );
-
+#endif
dc.SetBackgroundMode( wxTRANSPARENT );
dc.SetTextForeground( GetLabelTextColour() );
dc.SetFont( GetLabelFont() );
int hAlign, vAlign;
GetRowLabelAlignment( &hAlign, &vAlign );
- wxRect rect;
rect.SetX( 2 );
rect.SetY( GetRowTop(row) + 2 );
rect.SetWidth( m_rowLabelWidth - 4 );
if ( GetColWidth(col) <= 0 )
return;
- int colLeft = GetColLeft(col),
- colRight = GetColRight(col) - 1;
+ int colLeft = GetColLeft(col);
+
+ wxRect rect;
+#ifdef __WXGTK__
+ rect.SetX( colLeft + 1 );
+ rect.SetY( 1 );
+ rect.SetWidth( GetColWidth(col) - 2 );
+ rect.SetHeight( m_colLabelHeight - 2 );
+
+ wxWindowDC *win_dc = (wxWindowDC*) &dc;
+
+ wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
+#else
+ int colRight = GetColRight(col) - 1;
dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) );
dc.DrawLine( colRight, 0,
dc.SetPen( *wxWHITE_PEN );
dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight-1 );
dc.DrawLine( colLeft, 1, colRight, 1 );
-
+#endif
dc.SetBackgroundMode( wxTRANSPARENT );
dc.SetTextForeground( GetLabelTextColour() );
dc.SetFont( GetLabelFont() );
GetColLabelAlignment( &hAlign, &vAlign );
orient = GetColLabelTextOrientation();
- wxRect rect;
rect.SetX( colLeft + 2 );
rect.SetY( 2 );
rect.SetWidth( GetColWidth(col) - 4 );
EndBatch();
}
+bool wxGrid::Enable(bool enable)
+{
+ if ( !wxScrolledWindow::Enable(enable) )
+ return false;
+
+ // redraw in the new state
+ m_gridWin->Refresh();
+
+ return true;
+}
//
// ------ Edit control functions
void wxGrid::SetColMinimalWidth( int col, int width )
{
if (width > GetColMinimalAcceptableWidth()) {
- m_colMinWidths[col] = width;
+ wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)col;
+ m_colMinWidths[key] = width;
}
}
void wxGrid::SetRowMinimalHeight( int row, int width )
{
if (width > GetRowMinimalAcceptableHeight()) {
- m_rowMinHeights[row] = width;
+ wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)row;
+ m_rowMinHeights[key] = width;
}
}
int wxGrid::GetColMinimalWidth(int col) const
{
- wxLongToLongHashMap::const_iterator it = m_colMinWidths.find(col);
+ wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)col;
+ wxLongToLongHashMap::const_iterator it = m_colMinWidths.find(key);
return it != m_colMinWidths.end() ? (int)it->second : m_minAcceptableColWidth;
}
int wxGrid::GetRowMinimalHeight(int row) const
{
- wxLongToLongHashMap::const_iterator it = m_rowMinHeights.find(row);
+ wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)row;
+ wxLongToLongHashMap::const_iterator it = m_rowMinHeights.find(key);
return it != m_rowMinHeights.end() ? (int)it->second : m_minAcceptableRowHeight;
}
}
else
{
- rect = wxRect( 0, 0, 0, 0 );
+ rect = wxRect(0,0,0,0);
}
cellRect = CellToRect( bottomRight );
m_gridWin->GetClientSize( &cw, &ch );
if (right < 0 || bottom < 0 || left > cw || top > ch)
- return wxRect( 0, 0, 0, 0);
+ return wxRect(0,0,0,0);
rect.SetLeft( wxMax(0, left) );
rect.SetTop( wxMax(0, top) );