1. wxGCBoolRenderer looks better under MSW
2. wxGCBoolEditor too 3. only alnum keys start editing in-place 4. some memory leaks in wxGrid plugged git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6251 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -255,7 +255,8 @@ public:
|
|||||||
// data structures used for the data type registry
|
// data structures used for the data type registry
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
struct wxGridDataTypeInfo {
|
struct wxGridDataTypeInfo
|
||||||
|
{
|
||||||
wxGridDataTypeInfo(const wxString& typeName,
|
wxGridDataTypeInfo(const wxString& typeName,
|
||||||
wxGridCellRenderer* renderer,
|
wxGridCellRenderer* renderer,
|
||||||
wxGridCellEditor* editor)
|
wxGridCellEditor* editor)
|
||||||
@@ -273,9 +274,11 @@ struct wxGridDataTypeInfo {
|
|||||||
WX_DEFINE_ARRAY(wxGridDataTypeInfo*, wxGridDataTypeInfoArray);
|
WX_DEFINE_ARRAY(wxGridDataTypeInfo*, wxGridDataTypeInfoArray);
|
||||||
|
|
||||||
|
|
||||||
class WXDLLEXPORT wxGridTypeRegistry {
|
class WXDLLEXPORT wxGridTypeRegistry
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
~wxGridTypeRegistry();
|
~wxGridTypeRegistry();
|
||||||
|
|
||||||
void RegisterDataType(const wxString& typeName,
|
void RegisterDataType(const wxString& typeName,
|
||||||
wxGridCellRenderer* renderer,
|
wxGridCellRenderer* renderer,
|
||||||
wxGridCellEditor* editor);
|
wxGridCellEditor* editor);
|
||||||
@@ -287,9 +290,6 @@ private:
|
|||||||
wxGridDataTypeInfoArray m_typeinfo;
|
wxGridDataTypeInfoArray m_typeinfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// conditional compilation
|
// conditional compilation
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -367,6 +367,8 @@ void wxGridCellEditor::Destroy()
|
|||||||
{
|
{
|
||||||
if (m_control)
|
if (m_control)
|
||||||
{
|
{
|
||||||
|
m_control->PopEventHandler(TRUE /* delete it*/);
|
||||||
|
|
||||||
m_control->Destroy();
|
m_control->Destroy();
|
||||||
m_control = NULL;
|
m_control = NULL;
|
||||||
}
|
}
|
||||||
@@ -801,17 +803,46 @@ void wxGridCellBoolEditor::Create(wxWindow* parent,
|
|||||||
|
|
||||||
void wxGridCellBoolEditor::SetSize(const wxRect& r)
|
void wxGridCellBoolEditor::SetSize(const wxRect& r)
|
||||||
{
|
{
|
||||||
// position it in the centre of the rectangle (TODO: support alignment?)
|
bool resize = FALSE;
|
||||||
int w, h;
|
wxSize size = m_control->GetSize();
|
||||||
m_control->GetSize(&w, &h);
|
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,
|
// the checkbox without label still has some space to the right in wxGTK,
|
||||||
// so shift it to the right
|
// so shift it to the right
|
||||||
#if defined(__WXGTK__) || defined (__WXMOTIF__)
|
size.x -= 8;
|
||||||
w -= 8;
|
#elif defined(__WXMSW__)
|
||||||
#endif // GTK && Motif
|
// here too...
|
||||||
|
size.x -= 6;
|
||||||
|
size.y -= 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
m_control->Move(r.x + r.width/2 - w/2, r.y + r.height/2 - h/2);
|
m_control->Move(r.x + r.width/2 - size.x/2, r.y + r.height/2 - size.y/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGridCellBoolEditor::Show(bool show, wxGridCellAttr *attr)
|
void wxGridCellBoolEditor::Show(bool show, wxGridCellAttr *attr)
|
||||||
@@ -1225,8 +1256,14 @@ wxSize wxGridCellFloatRenderer::GetBestSize(wxGrid& grid,
|
|||||||
|
|
||||||
wxSize wxGridCellBoolRenderer::ms_sizeCheckMark;
|
wxSize wxGridCellBoolRenderer::ms_sizeCheckMark;
|
||||||
|
|
||||||
|
// FIXME these checkbox size calculations are really ugly...
|
||||||
|
|
||||||
// between checkmark and box
|
// between checkmark and box
|
||||||
static const wxCoord wxGRID_CHECKMARK_MARGIN = 4;
|
#ifdef __WXGTK__
|
||||||
|
static const wxCoord wxGRID_CHECKMARK_MARGIN = 4;
|
||||||
|
#else
|
||||||
|
static const wxCoord wxGRID_CHECKMARK_MARGIN = 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid,
|
wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid,
|
||||||
wxGridCellAttr& WXUNUSED(attr),
|
wxGridCellAttr& WXUNUSED(attr),
|
||||||
@@ -1267,6 +1304,16 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid,
|
|||||||
|
|
||||||
// draw a check mark in the centre (ignoring alignment - TODO)
|
// draw a check mark in the centre (ignoring alignment - TODO)
|
||||||
wxSize size = GetBestSize(grid, attr, dc, row, col);
|
wxSize size = GetBestSize(grid, attr, dc, row, col);
|
||||||
|
|
||||||
|
// don't draw outside the cell
|
||||||
|
wxCoord minSize = wxMin(rect.width, rect.height);
|
||||||
|
if ( size.x >= minSize || size.y >= minSize )
|
||||||
|
{
|
||||||
|
// and even leave (at least) 1 pixel margin
|
||||||
|
size.x = size.y = minSize - 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw a border around checkmark
|
||||||
wxRect rectMark;
|
wxRect rectMark;
|
||||||
rectMark.x = rect.x + rect.width/2 - size.x/2;
|
rectMark.x = rect.x + rect.width/2 - size.x/2;
|
||||||
rectMark.y = rect.y + rect.height/2 - size.y/2;
|
rectMark.y = rect.y + rect.height/2 - size.y/2;
|
||||||
@@ -1279,8 +1326,13 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid,
|
|||||||
|
|
||||||
rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN);
|
rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN);
|
||||||
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
// looks nicer under MSW
|
||||||
|
rectMark.x++;
|
||||||
|
#endif // MSW
|
||||||
|
|
||||||
bool value;
|
bool value;
|
||||||
if (grid.GetTable()->CanGetValueAs(row, col, wxT("bool")))
|
if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) )
|
||||||
value = grid.GetTable()->GetValueAsBool(row, col);
|
value = grid.GetTable()->GetValueAsBool(row, col);
|
||||||
else
|
else
|
||||||
value = !!grid.GetTable()->GetValue(row, col);
|
value = !!grid.GetTable()->GetValue(row, col);
|
||||||
@@ -1702,7 +1754,8 @@ void wxGridCellAttrProvider::UpdateAttrCols( size_t pos, int numCols )
|
|||||||
|
|
||||||
wxGridTypeRegistry::~wxGridTypeRegistry()
|
wxGridTypeRegistry::~wxGridTypeRegistry()
|
||||||
{
|
{
|
||||||
for (size_t i=0; i<m_typeinfo.Count(); i++)
|
size_t count = m_typeinfo.Count();
|
||||||
|
for ( size_t i = 0; i < count; i++ )
|
||||||
delete m_typeinfo[i];
|
delete m_typeinfo[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4064,6 +4117,10 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
|
|||||||
ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW);
|
ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( dragCol >= 0 )
|
||||||
|
{
|
||||||
|
m_dragRowOrCol = dragCol;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4675,14 +4732,6 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
|
|||||||
MovePageDown();
|
MovePageDown();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// We don't want these keys to trigger the edit control, any others?
|
|
||||||
case WXK_SHIFT:
|
|
||||||
case WXK_ALT:
|
|
||||||
case WXK_CONTROL:
|
|
||||||
case WXK_CAPITAL:
|
|
||||||
event.Skip();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WXK_SPACE:
|
case WXK_SPACE:
|
||||||
if ( !IsEditable() )
|
if ( !IsEditable() )
|
||||||
{
|
{
|
||||||
@@ -4692,9 +4741,13 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
|
|||||||
// Otherwise fall through to default
|
// Otherwise fall through to default
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// now try the cell edit control
|
// alphanumeric keys enable the cell edit control
|
||||||
//
|
if ( !(event.AltDown() ||
|
||||||
if ( !IsCellEditControlEnabled() && CanEnableCellControl() )
|
event.MetaDown() ||
|
||||||
|
event.ControlDown()) &&
|
||||||
|
isalnum(event.KeyCode()) &&
|
||||||
|
!IsCellEditControlEnabled() &&
|
||||||
|
CanEnableCellControl() )
|
||||||
{
|
{
|
||||||
EnableCellEditControl();
|
EnableCellEditControl();
|
||||||
int row = m_currentCellCoords.GetRow();
|
int row = m_currentCellCoords.GetRow();
|
||||||
@@ -4705,7 +4758,8 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// let others process char events for readonly cells
|
// let others process char events with modifiers or all
|
||||||
|
// char events for readonly cells
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -79,9 +79,14 @@ bool wxCheckBox::Create(wxWindow *parent,
|
|||||||
|
|
||||||
m_windowStyle = style;
|
m_windowStyle = style;
|
||||||
|
|
||||||
|
// VZ: disabling this ugliness which completely breaks checkboxes in wxGrid
|
||||||
|
// whoever did it, please tell me where and how does the checkbox fail
|
||||||
|
// to appear
|
||||||
|
#if 0
|
||||||
wxString Label = label;
|
wxString Label = label;
|
||||||
if (Label == wxT(""))
|
if (Label == wxT(""))
|
||||||
Label = wxT(" "); // Apparently needed or checkbox won't show
|
Label = wxT(" "); // Apparently needed or checkbox won't show
|
||||||
|
#endif // 0
|
||||||
|
|
||||||
if ( id == -1 )
|
if ( id == -1 )
|
||||||
m_windowId = NewControlId();
|
m_windowId = NewControlId();
|
||||||
@@ -111,7 +116,7 @@ bool wxCheckBox::Create(wxWindow *parent,
|
|||||||
msStyle |= WS_BORDER;
|
msStyle |= WS_BORDER;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
m_hWnd = (WXHWND)CreateWindowEx(exStyle, wxT("BUTTON"), Label,
|
m_hWnd = (WXHWND)CreateWindowEx(exStyle, wxT("BUTTON"), label,
|
||||||
msStyle,
|
msStyle,
|
||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
(HWND)parent->GetHWND(), (HMENU)m_windowId,
|
(HWND)parent->GetHWND(), (HMENU)m_windowId,
|
||||||
|
@@ -65,6 +65,10 @@
|
|||||||
#define TV_FIRST 0x1100
|
#define TV_FIRST 0x1100
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef TVS_CHECKBOXES
|
||||||
|
#define TVS_CHECKBOXES 0x0100
|
||||||
|
#endif
|
||||||
|
|
||||||
// old headers might miss these messages (comctl32.dll 4.71+ only)
|
// old headers might miss these messages (comctl32.dll 4.71+ only)
|
||||||
#ifndef TVM_SETBKCOLOR
|
#ifndef TVM_SETBKCOLOR
|
||||||
#define TVM_SETBKCOLOR (TV_FIRST + 29)
|
#define TVM_SETBKCOLOR (TV_FIRST + 29)
|
||||||
@@ -346,10 +350,6 @@ bool wxTreeCtrl::Create(wxWindow *parent,
|
|||||||
!defined( __WATCOMC__ ) && \
|
!defined( __WATCOMC__ ) && \
|
||||||
(!defined(__VISUALC__) || (__VISUALC__ > 1010))
|
(!defined(__VISUALC__) || (__VISUALC__ > 1010))
|
||||||
|
|
||||||
#ifndef TVS_CHECKBOXES
|
|
||||||
#define TVS_CHECKBOXES 0x0100
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// we emulate the multiple selection tree controls by using checkboxes: set
|
// we emulate the multiple selection tree controls by using checkboxes: set
|
||||||
// up the image list we need for this if we do have multiple selections
|
// up the image list we need for this if we do have multiple selections
|
||||||
if ( m_windowStyle & wxTR_MULTIPLE )
|
if ( m_windowStyle & wxTR_MULTIPLE )
|
||||||
@@ -1321,6 +1321,24 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
|
|||||||
|
|
||||||
wxTextCtrl* wxTreeCtrl::GetEditControl() const
|
wxTextCtrl* wxTreeCtrl::GetEditControl() const
|
||||||
{
|
{
|
||||||
|
// normally, we could try to do something like this to return something
|
||||||
|
// even when the editing was started by the user and not by calling
|
||||||
|
// EditLabel() - but as nobody has asked for this so far and there might be
|
||||||
|
// problems in the code below, I leave it disabled for now (VZ)
|
||||||
|
#if 0
|
||||||
|
if ( !m_textCtrl )
|
||||||
|
{
|
||||||
|
HWND hwndText = TreeView_GetEditControl(GetHwnd());
|
||||||
|
if ( hwndText )
|
||||||
|
{
|
||||||
|
m_textCtrl = new wxTextCtrl(this, -1);
|
||||||
|
m_textCtrl->Hide();
|
||||||
|
m_textCtrl->SetHWND((WXHWND)hwndText);
|
||||||
|
}
|
||||||
|
//else: not editing label right now
|
||||||
|
}
|
||||||
|
#endif // 0
|
||||||
|
|
||||||
return m_textCtrl;
|
return m_textCtrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1340,6 +1358,8 @@ wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
|
|||||||
{
|
{
|
||||||
wxASSERT( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)) );
|
wxASSERT( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)) );
|
||||||
|
|
||||||
|
DeleteTextCtrl();
|
||||||
|
|
||||||
HWND hWnd = (HWND) TreeView_EditLabel(GetHwnd(), (HTREEITEM) (WXHTREEITEM) item);
|
HWND hWnd = (HWND) TreeView_EditLabel(GetHwnd(), (HTREEITEM) (WXHTREEITEM) item);
|
||||||
|
|
||||||
// this is not an error - the TVN_BEGINLABELEDIT handler might have
|
// this is not an error - the TVN_BEGINLABELEDIT handler might have
|
||||||
@@ -1349,8 +1369,6 @@ wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteTextCtrl();
|
|
||||||
|
|
||||||
m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
|
m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
|
||||||
m_textCtrl->SetHWND((WXHWND)hWnd);
|
m_textCtrl->SetHWND((WXHWND)hWnd);
|
||||||
m_textCtrl->SubclassWin((WXHWND)hWnd);
|
m_textCtrl->SubclassWin((WXHWND)hWnd);
|
||||||
|
@@ -3034,17 +3034,25 @@ bool wxWindow::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( win )
|
if ( win )
|
||||||
return win->MSWCommand(cmd, id);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// If no child window, it may be an accelerator, e.g. for
|
return win->MSWCommand(cmd, id);
|
||||||
// a popup menu command.
|
}
|
||||||
|
|
||||||
|
// the messages sent from the in-place edit control used by the treectrl
|
||||||
|
// for label editing have id == 0, but they should _not_ be treated as menu
|
||||||
|
// messages (they are EN_XXX ones, in fact) so don't translate anything
|
||||||
|
// coming from a control to wxEVT_COMMAND_MENU_SELECTED
|
||||||
|
if ( !control )
|
||||||
|
{
|
||||||
|
// If no child window, it may be an accelerator, e.g. for a popup menu
|
||||||
|
// command
|
||||||
|
|
||||||
wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED);
|
wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED);
|
||||||
event.SetEventObject(this);
|
event.SetEventObject(this);
|
||||||
event.SetId(id);
|
event.SetId(id);
|
||||||
event.SetInt(id);
|
event.SetInt(id);
|
||||||
return ProcessEvent(event);
|
|
||||||
|
return GetEventHandler()->ProcessEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
Reference in New Issue
Block a user