generate wxEVT_GRID_{COL,ROW}_SIZE events when the user double clicks the separating line too; do not generate these events if the size didn't really change (further improvements to grid events are possible and remain needed, see #10754)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60435 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2009-04-29 21:59:10 +00:00
parent b19bcdeb2b
commit 27bb2c8cb7
4 changed files with 87 additions and 86 deletions

View File

@ -1956,10 +1956,10 @@ protected:
// it was processed (but not vetoed) and 0 if it wasn't processed
int SendEvent(const wxEventType evtType,
int row, int col,
wxMouseEvent& e);
const wxMouseEvent& e);
int SendEvent(const wxEventType evtType,
const wxGridCellCoords& coords,
wxMouseEvent& e)
const wxMouseEvent& e)
{ return SendEvent(evtType, coords.GetRow(), coords.GetCol(), e); }
int SendEvent(const wxEventType evtType,
int row, int col,
@ -1971,6 +1971,11 @@ protected:
int SendEvent(const wxEventType evtType, const wxString& s = wxString())
{ return SendEvent(evtType, m_currentCellCoords, s); }
// send wxEVT_GRID_{ROW,COL}_SIZE
void SendSizeEvent(wxEventType type,
int row, int col,
const wxMouseEvent& mouseEv);
void OnPaint( wxPaintEvent& );
void OnSize( wxSizeEvent& );
void OnKeyDown( wxKeyEvent& );
@ -2084,14 +2089,14 @@ private:
void DoUpdateResizeColWidth(int w);
void DoStartMoveCol(int col);
void DoEndDragResizeRow();
void DoEndDragResizeCol(wxMouseEvent *event = NULL);
void DoEndDragResizeRow(const wxMouseEvent& event);
void DoEndDragResizeCol(const wxMouseEvent& event);
void DoEndMoveCol(int pos);
// common implementations of methods defined for both rows and columns
void DeselectLine(int line, const wxGridOperations& oper);
void DoEndDragResizeLine(const wxGridOperations& oper);
bool DoEndDragResizeLine(const wxGridOperations& oper);
int PosToLinePos(int pos, bool clipToMinMax,
const wxGridOperations& oper) const;
int PosToLine(int pos, bool clipToMinMax,

View File

@ -195,7 +195,12 @@ private:
// as this is done by the user we should notify the main program about
// it
GetOwner()->SendEvent(wxEVT_GRID_COL_SIZE, -1, idx);
// make up a dummy event for the grid event to use -- unfortunately we
// can't do anything else here
wxMouseEvent e;
e.SetState(wxGetMouseState());
GetOwner()->SendSizeEvent(wxEVT_GRID_COL_SIZE, -1, idx, e);
}
// overridden to react to the columns order changes in the customization
@ -226,7 +231,12 @@ private:
void OnEndResize(wxHeaderCtrlEvent& event)
{
GetOwner()->DoEndDragResizeCol();
// we again need to pass a mouse event to be used for the grid event
// generation but we don't have it here so use a dummy one as in
// UpdateColumnVisibility()
wxMouseEvent e;
e.SetState(wxGetMouseState());
GetOwner()->DoEndDragResizeCol(e);
event.Skip();
}

View File

@ -3639,18 +3639,16 @@ public:
This event class contains information about a row/column resize event.
@beginEventTable{wxGridSizeEvent}
@event{EVT_GRID_COL_SIZE(func)}
The user resized a column by dragging it. Processes a
@c wxEVT_GRID_COL_SIZE event type.
@event{EVT_GRID_ROW_SIZE(func)}
The user resized a row by dragging it. Processes a
@c wxEVT_GRID_ROW_SIZE event type.
@event{EVT_GRID_CMD_COL_SIZE(id, func)}
The user resized a column by dragging it; variant taking a window
identifier. Processes a @c wxEVT_GRID_COL_SIZE event type.
The user resized a column, corresponds to @c wxEVT_GRID_COL_SIZE event
type.
@event{EVT_GRID_CMD_ROW_SIZE(id, func)}
The user resized a row by dragging it; variant taking a window
identifier. Processes a @c wxEVT_GRID_ROW_SIZE event type.
The user resized a row, corresponds to @c wxEVT_GRID_ROW_SIZE event
type.
@event{EVT_GRID_COL_SIZE(func)}
Same as EVT_GRID_CMD_COL_SIZE() but uses `wxID_ANY` id.
@event{EVT_GRID_ROW_SIZE(func)}
Same as EVT_GRID_CMD_ROW_SIZE() but uses `wxID_ANY` id.
@endEventTable
@library{wxadv}

View File

@ -2969,8 +2969,12 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
if ( row != wxNOT_FOUND && CanDragRowSize(row) )
{
// adjust row height depending on label text
//
// TODO: generate RESIZING event, see #10754
AutoSizeRowLabelSize( row );
SendSizeEvent(wxEVT_GRID_ROW_SIZE, row, -1, event);
ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, GetColLabelWindow());
m_dragLastPos = -1;
}
@ -2990,14 +2994,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
else if ( event.LeftUp() )
{
if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW )
{
DoEndDragResizeRow();
// Note: we are ending the event *after* doing
// default processing in this case
//
SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event );
}
DoEndDragResizeRow(event);
ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_rowLabelWin);
m_dragLastPos = -1;
@ -3318,8 +3315,12 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
else
{
// adjust column width depending on label text
//
// TODO: generate RESIZING event, see #10754
AutoSizeColLabelSize( colEdge );
SendSizeEvent(wxEVT_GRID_COL_SIZE, -1, colEdge, event);
ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, GetColLabelWindow());
m_dragLastPos = -1;
}
@ -3332,7 +3333,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
switch ( m_cursorMode )
{
case WXGRID_CURSOR_RESIZE_COL:
DoEndDragResizeCol();
DoEndDragResizeCol(event);
break;
case WXGRID_CURSOR_MOVE_COL:
@ -3754,17 +3755,12 @@ wxGrid::DoGridCellLeftUp(wxMouseEvent& event, const wxGridCellCoords& coords)
else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW )
{
ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL);
DoEndDragResizeRow();
// Note: we are ending the event *after* doing
// default processing in this case
//
SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event );
DoEndDragResizeRow(event);
}
else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL )
{
ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL);
DoEndDragResizeCol();
DoEndDragResizeCol(event);
}
m_dragLastPos = -1;
@ -3894,10 +3890,11 @@ void wxGrid::ProcessGridCellMouseEvent(wxMouseEvent& event)
}
}
void wxGrid::DoEndDragResizeLine(const wxGridOperations& oper)
// this function returns true only if the size really changed
bool wxGrid::DoEndDragResizeLine(const wxGridOperations& oper)
{
if ( m_dragLastPos == -1 )
return;
return false;
const wxGridOperations& doper = oper.Dual();
@ -3921,9 +3918,12 @@ void wxGrid::DoEndDragResizeLine(const wxGridOperations& oper)
// do resize the line
const int lineStart = oper.GetLineStartPos(this, m_dragRowOrCol);
const int lineSizeOld = oper.GetLineSize(this, m_dragRowOrCol);
oper.SetLineSize(this, m_dragRowOrCol,
wxMax(m_dragLastPos - lineStart,
oper.GetMinimalLineSize(this, m_dragRowOrCol)));
const bool
sizeChanged = oper.GetLineSize(this, m_dragRowOrCol) != lineSizeOld;
m_dragLastPos = -1;
@ -3986,24 +3986,24 @@ void wxGrid::DoEndDragResizeLine(const wxGridOperations& oper)
// show the edit control back again
ShowCellEditControl();
return sizeChanged;
}
void wxGrid::DoEndDragResizeRow()
void wxGrid::DoEndDragResizeRow(const wxMouseEvent& event)
{
DoEndDragResizeLine(wxGridRowOperations());
// TODO: generate RESIZING event, see #10754
if ( DoEndDragResizeLine(wxGridRowOperations()) )
SendSizeEvent(wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event);
}
void wxGrid::DoEndDragResizeCol(wxMouseEvent *event)
void wxGrid::DoEndDragResizeCol(const wxMouseEvent& event)
{
DoEndDragResizeLine(wxGridColumnOperations());
// TODO: generate RESIZING event, see #10754
// Note: we are ending the event *after* doing
// default processing in this case
//
if ( event )
SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, *event );
else
SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol );
if ( DoEndDragResizeLine(wxGridColumnOperations()) )
SendSizeEvent(wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event);
}
void wxGrid::DoStartMoveCol(int col)
@ -4177,37 +4177,40 @@ wxGrid::DoAppendLines(bool (wxGridTableBase::*funcAppend)(size_t),
return (m_table->*funcAppend)(num);
}
//
// ----- event handlers
//
// ----------------------------------------------------------------------------
// event generation helpers
// ----------------------------------------------------------------------------
void
wxGrid::SendSizeEvent(wxEventType type,
int row, int col,
const wxMouseEvent& mouseEv)
{
int rowOrCol = row == -1 ? col : row;
wxGridSizeEvent gridEvt( GetId(),
type,
this,
rowOrCol,
mouseEv.GetX() + GetRowLabelSize(),
mouseEv.GetY() + GetColLabelSize(),
mouseEv);
GetEventHandler()->ProcessEvent(gridEvt);
}
// Generate a grid event based on a mouse event and return:
// -1 if the event was vetoed
// +1 if the event was processed (but not vetoed)
// 0 if the event wasn't handled
int
wxGrid::SendEvent(const wxEventType type,
wxGrid::SendEvent(wxEventType type,
int row, int col,
wxMouseEvent& mouseEv)
const wxMouseEvent& mouseEv)
{
bool claimed, vetoed;
if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE )
{
int rowOrCol = (row == -1 ? col : row);
wxGridSizeEvent gridEvt( GetId(),
type,
this,
rowOrCol,
mouseEv.GetX() + GetRowLabelSize(),
mouseEv.GetY() + GetColLabelSize(),
mouseEv);
claimed = GetEventHandler()->ProcessEvent(gridEvt);
vetoed = !gridEvt.IsAllowed();
}
else if ( type == wxEVT_GRID_RANGE_SELECT )
if ( type == wxEVT_GRID_RANGE_SELECT )
{
// Right now, it should _never_ end up here!
wxGridRangeSelectEvent gridEvt( GetId(),
@ -4270,28 +4273,13 @@ wxGrid::SendEvent(const wxEventType type,
int
wxGrid::SendEvent(const wxEventType type, int row, int col, const wxString& s)
{
bool claimed, vetoed;
wxGridEvent gridEvt( GetId(), type, this, row, col );
gridEvt.SetString(s);
if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE )
{
int rowOrCol = (row == -1 ? col : row);
wxGridSizeEvent gridEvt( GetId(), type, this, rowOrCol );
claimed = GetEventHandler()->ProcessEvent(gridEvt);
vetoed = !gridEvt.IsAllowed();
}
else
{
wxGridEvent gridEvt( GetId(), type, this, row, col );
gridEvt.SetString(s);
claimed = GetEventHandler()->ProcessEvent(gridEvt);
vetoed = !gridEvt.IsAllowed();
}
const bool claimed = GetEventHandler()->ProcessEvent(gridEvt);
// A Veto'd event may not be `claimed' so test this first
if (vetoed)
if ( !gridEvt.IsAllowed() )
return -1;
return claimed ? 1 : 0;