grid.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 2,252 行 · 第 1/5 页
CPP
2,252 行
}
bool wxGridCellNumberEditor::EndEdit(int row, int col,
wxGrid* grid)
{
bool changed;
long value = 0;
wxString text;
#if wxUSE_SPINCTRL
if ( HasRange() )
{
value = Spin()->GetValue();
changed = value != m_valueOld;
if (changed)
text = wxString::Format(wxT("%ld"), value);
}
else
#endif
{
text = Text()->GetValue();
changed = (text.empty() || text.ToLong(&value)) && (value != m_valueOld);
}
if ( changed )
{
if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_NUMBER))
grid->GetTable()->SetValueAsLong(row, col, value);
else
grid->GetTable()->SetValue(row, col, text);
}
return changed;
}
void wxGridCellNumberEditor::Reset()
{
#if wxUSE_SPINCTRL
if ( HasRange() )
{
Spin()->SetValue((int)m_valueOld);
}
else
#endif
{
DoReset(GetString());
}
}
bool wxGridCellNumberEditor::IsAcceptedKey(wxKeyEvent& event)
{
if ( wxGridCellEditor::IsAcceptedKey(event) )
{
int keycode = event.GetKeyCode();
if ( (keycode < 128) &&
(wxIsdigit(keycode) || keycode == '+' || keycode == '-'))
{
return true;
}
}
return false;
}
void wxGridCellNumberEditor::StartingKey(wxKeyEvent& event)
{
int keycode = event.GetKeyCode();
if ( !HasRange() )
{
if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-')
{
wxGridCellTextEditor::StartingKey(event);
// skip Skip() below
return;
}
}
#if wxUSE_SPINCTRL
else
{
if ( wxIsdigit(keycode) )
{
wxSpinCtrl* spin = (wxSpinCtrl*)m_control;
spin->SetValue(keycode - '0');
spin->SetSelection(1,1);
return;
}
}
#endif
event.Skip();
}
void wxGridCellNumberEditor::SetParameters(const wxString& params)
{
if ( !params )
{
// reset to default
m_min =
m_max = -1;
}
else
{
long tmp;
if ( params.BeforeFirst(_T(',')).ToLong(&tmp) )
{
m_min = (int)tmp;
if ( params.AfterFirst(_T(',')).ToLong(&tmp) )
{
m_max = (int)tmp;
// skip the error message below
return;
}
}
wxLogDebug(_T("Invalid wxGridCellNumberEditor parameter string '%s' ignored"), params.c_str());
}
}
// return the value in the spin control if it is there (the text control otherwise)
wxString wxGridCellNumberEditor::GetValue() const
{
wxString s;
#if wxUSE_SPINCTRL
if( HasRange() )
{
long value = Spin()->GetValue();
s.Printf(wxT("%ld"), value);
}
else
#endif
{
s = Text()->GetValue();
}
return s;
}
// ----------------------------------------------------------------------------
// wxGridCellFloatEditor
// ----------------------------------------------------------------------------
wxGridCellFloatEditor::wxGridCellFloatEditor(int width, int precision)
{
m_width = width;
m_precision = precision;
}
void wxGridCellFloatEditor::Create(wxWindow* parent,
wxWindowID id,
wxEvtHandler* evtHandler)
{
wxGridCellTextEditor::Create(parent, id, evtHandler);
#if wxUSE_VALIDATORS
Text()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
#endif // wxUSE_VALIDATORS
}
void wxGridCellFloatEditor::BeginEdit(int row, int col, wxGrid* grid)
{
// first get the value
wxGridTableBase *table = grid->GetTable();
if ( table->CanGetValueAs(row, col, wxGRID_VALUE_FLOAT) )
{
m_valueOld = table->GetValueAsDouble(row, col);
}
else
{
m_valueOld = 0.0;
wxString sValue = table->GetValue(row, col);
if (! sValue.ToDouble(&m_valueOld) && ! sValue.empty())
{
wxFAIL_MSG( _T("this cell doesn't have float value") );
return;
}
}
DoBeginEdit(GetString());
}
bool wxGridCellFloatEditor::EndEdit(int row, int col,
wxGrid* grid)
{
double value = 0.0;
wxString text(Text()->GetValue());
if ( (text.empty() || text.ToDouble(&value)) && (value != m_valueOld) )
{
if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT))
grid->GetTable()->SetValueAsDouble(row, col, value);
else
grid->GetTable()->SetValue(row, col, text);
return true;
}
return false;
}
void wxGridCellFloatEditor::Reset()
{
DoReset(GetString());
}
void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event)
{
int keycode = event.GetKeyCode();
char tmpbuf[2];
tmpbuf[0] = (char) keycode;
tmpbuf[1] = '\0';
wxString strbuf(tmpbuf, *wxConvCurrent);
#if wxUSE_INTL
bool is_decimal_point = ( strbuf ==
wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) );
#else
bool is_decimal_point = ( strbuf == _T(".") );
#endif
if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
|| is_decimal_point )
{
wxGridCellTextEditor::StartingKey(event);
// skip Skip() below
return;
}
event.Skip();
}
void wxGridCellFloatEditor::SetParameters(const wxString& params)
{
if ( !params )
{
// reset to default
m_width =
m_precision = -1;
}
else
{
long tmp;
if ( params.BeforeFirst(_T(',')).ToLong(&tmp) )
{
m_width = (int)tmp;
if ( params.AfterFirst(_T(',')).ToLong(&tmp) )
{
m_precision = (int)tmp;
// skip the error message below
return;
}
}
wxLogDebug(_T("Invalid wxGridCellFloatEditor parameter string '%s' ignored"), params.c_str());
}
}
wxString wxGridCellFloatEditor::GetString() const
{
wxString fmt;
if ( m_precision == -1 && m_width != -1)
{
// default precision
fmt.Printf(_T("%%%d.f"), m_width);
}
else if ( m_precision != -1 && m_width == -1)
{
// default width
fmt.Printf(_T("%%.%df"), m_precision);
}
else if ( m_precision != -1 && m_width != -1 )
{
fmt.Printf(_T("%%%d.%df"), m_width, m_precision);
}
else
{
// default width/precision
fmt = _T("%f");
}
return wxString::Format(fmt, m_valueOld);
}
bool wxGridCellFloatEditor::IsAcceptedKey(wxKeyEvent& event)
{
if ( wxGridCellEditor::IsAcceptedKey(event) )
{
int keycode = event.GetKeyCode();
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);
#if wxUSE_INTL
bool is_decimal_point =
( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT,
wxLOCALE_CAT_NUMBER) );
#else
bool is_decimal_point = ( strbuf == _T(".") );
#endif
if ( (keycode < 128) &&
(wxIsdigit(keycode) || tolower(keycode) == 'e' ||
is_decimal_point || keycode == '+' || keycode == '-') )
return true;
}
return false;
}
#endif // wxUSE_TEXTCTRL
#if wxUSE_CHECKBOX
// ----------------------------------------------------------------------------
// wxGridCellBoolEditor
// ----------------------------------------------------------------------------
void wxGridCellBoolEditor::Create(wxWindow* parent,
wxWindowID id,
wxEvtHandler* evtHandler)
{
m_control = new wxCheckBox(parent, id, wxEmptyString,
wxDefaultPosition, wxDefaultSize,
wxNO_BORDER);
wxGridCellEditor::Create(parent, id, evtHandler);
}
void wxGridCellBoolEditor::SetSize(const wxRect& r)
{
bool resize = false;
wxSize size = m_control->GetSize();
wxCoord minSize = wxMin(r.width, r.height);
// check if the checkbox is not too big/small for this cell
wxSize sizeBest = m_control->GetBestSize();
if ( !(size == sizeBest) )
{
// reset to default size if it had been made smaller
size = sizeBest;
resize = true;
}
if ( size.x >= minSize || size.y >= minSize )
{
// leave 1 pixel margin
size.x = size.y = minSize - 2;
resize = true;
}
if ( resize )
{
m_control->SetSize(size);
}
// position it in the centre of the rectangle (TODO: support alignment?)
#if defined(__WXGTK__) || defined (__WXMOTIF__)
// the checkbox without label still has some space to the right in wxGTK,
// so shift it to the right
size.x -= 8;
#elif defined(__WXMSW__)
// here too, but in other way
size.x += 1;
size.y -= 2;
#endif
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)
{
m_control->Show(show);
if ( show )
{
wxColour colBg = attr ? attr->GetBackgroundColour() : *wxLIGHT_GREY;
CBox()->SetBackgroundColour(colBg);
}
}
void wxGridCellBoolEditor::BeginEdit(int row, int col, wxGrid* grid)
{
wxASSERT_MSG(m_control,
wxT("The wxGridCellEditor must be Created first!"));
if (grid->GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL))
m_startValue = grid->GetTable()->GetValueAsBool(row, col);
else
{
wxString cellval( grid->GetTable()->GetValue(row, col) );
m_startValue = !( !cellval || (cellval == wxT("0")) );
}
CBox()->SetValue(m_startValue);
CBox()->SetFocus();
}
bool wxGridCellBoolEditor::EndEdit(int row, int col,
wxGrid* grid)
{
wxASSERT_MSG(m_control,
wxT("The wxGridCellEditor must be Created first!"));
bool changed = false;
bool value = CBox()->GetValue();
if ( value != m_startValue )
changed = true;
if ( changed )
{
if (grid->GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL))
grid->GetTable()->SetValueAsBool(row, col, value);
else
grid->GetTable()->SetValue(row, col, value ? _T("1") : wxEmptyString);
}
return changed;
}
void wxGridCellBoolEditor::Reset()
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?