added EVT_HEADER_DRAGGING_CANCELLED event sent when either resizing or reordering operation is cancelled instead of having a special cancelled flag in normal END_RESIZE/REORDER events

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57233 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-10 16:05:21 +00:00
parent 702f5349c6
commit 565804f2b9
6 changed files with 35 additions and 42 deletions

View File

@@ -151,7 +151,7 @@ private:
// control, see wxHeaderCtrlSimple for a standalone version
// ----------------------------------------------------------------------------
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
#if 0// defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
#include "wx/msw/headerctrl.h"
#else
#define wxHAS_GENERIC_HEADERCTRL
@@ -288,8 +288,7 @@ public:
: wxNotifyEvent(commandType, winid),
m_col(-1),
m_width(0),
m_order(static_cast<unsigned int>(-1)),
m_cancelled(false)
m_order(static_cast<unsigned int>(-1))
{
}
@@ -297,8 +296,7 @@ public:
: wxNotifyEvent(event),
m_col(event.m_col),
m_width(event.m_width),
m_order(event.m_order),
m_cancelled(event.m_cancelled)
m_order(event.m_order)
{
}
@@ -314,10 +312,6 @@ public:
unsigned int GetNewOrder() const { return m_order; }
void SetNewOrder(unsigned int order) { m_order = order; }
// was the drag operation cancelled or did it complete successfully?
bool IsCancelled() const { return m_cancelled; }
void SetCancelled() { m_cancelled = true; }
virtual wxEvent *Clone() const { return new wxHeaderCtrlEvent(*this); }
protected:
@@ -330,9 +324,6 @@ protected:
// the new column position for end reorder event
unsigned int m_order;
// was the drag operation cancelled?
bool m_cancelled;
private:
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHeaderCtrlEvent)
};
@@ -355,6 +346,8 @@ extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_HEADER_END_RESIZE;
extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_HEADER_BEGIN_REORDER;
extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_HEADER_END_REORDER;
extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED;
typedef void (wxEvtHandler::*wxHeaderCtrlEventFunction)(wxHeaderCtrlEvent&);
#define wxHeaderCtrlEventHandler(func) \
@@ -381,4 +374,6 @@ typedef void (wxEvtHandler::*wxHeaderCtrlEventFunction)(wxHeaderCtrlEvent&);
#define EVT_HEADER_BEGIN_REORDER(id, fn) wx__DECLARE_HEADER_EVT(BEGIN_REORDER, id, fn)
#define EVT_HEADER_END_REORDER(id, fn) wx__DECLARE_HEADER_EVT(END_REORDER, id, fn)
#define EVT_HEADER_DRAGGING_CANCELLED(id, fn) wx__DECLARE_HEADER_EVT(DRAGGING_CANCELLED, id, fn)
#endif // _WX_HEADERCTRL_H_

View File

@@ -75,17 +75,17 @@
with the specified index (this can only happen for the columns for
which wxHeaderColumn::IsResizeable() returns true). The event can
be vetoed to prevent the column from being resized. If it isn't,
the resizing and end resize events will be generated later.
the resizing and end resize (or dragging cancelled) events will be
generated later.
@event{EVT_HEADER_RESIZING(id, func)}
The user is dragging the column with the specified index resizing
it and its current width is wxHeaderCtrlEvent::GetWidth(). The
event can be vetoed to stop the dragging operation completely at
any time.
@event{EVT_HEADER_END_RESIZE(id, func)}
Either the user stopped dragging the column by releasing the mouse
or the resizing was cancelled. If wxHeaderCtrlEvent::IsCancelled()
returns @true, nothing should be done, otherwise the column should
normally be resized to the value of wxHeaderCtrlEvent::GetWidth().
The user stopped dragging the column by releasing the mouse. The
column should normally be resized to the value of
wxHeaderCtrlEvent::GetWidth().
@event{EVT_HEADER_BEGIN_REORDER(id, func)}
The user started to drag the column with the specified index (this
@@ -93,13 +93,20 @@
event can be vetoed to prevent the column from being reordered,
otherwise the end reorder message will be generated later.
@event{EVT_HEADER_END_REORDER(id, func)}
Either the user dropped the column in its new location or the
drag operation was cancelled. If wxHeaderCtrlEvent::IsCancelled()
returns @true, nothing should be done, otherwise the event can be
The user dropped the column in its new location. The event can be
vetoed to prevent the column from being placed at the new position
or handled to update the display of the data in the associated
control to match the new column location (available from
wxHeaderCtrlEvent::GetNewOrder()).
@event{EVT_HEADER_DRAGGING_CANCELLED(id, func)}
The resizing or reordering operation currently in progress was
cancelled. This can happen if the user pressed Esc key while
dragging the mouse or the mouse capture was lost for some other
reason. You only need to handle this event if your application
entered into some modal mode when resizing or reordering began, in
which case it should handle this event in addition to the matching
end resizing or reordering ones.
@endEventTable
@library{wxcore}
@@ -509,11 +516,4 @@ public:
new column position in wxHeaderCtrl::GetColumnsOrder().
*/
unsigned int GetNewOrder() const;
/**
Return @true if the drag operation was cancelled.
This method can only be called for the end drag event.
*/
bool IsCancelled() const;
};

View File

@@ -247,3 +247,5 @@ const wxEventType wxEVT_COMMAND_HEADER_END_RESIZE = wxNewEventType();
const wxEventType wxEVT_COMMAND_HEADER_BEGIN_REORDER = wxNewEventType();
const wxEventType wxEVT_COMMAND_HEADER_END_REORDER = wxNewEventType();
const wxEventType wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED = wxNewEventType();

View File

@@ -175,14 +175,11 @@ private:
}
void OnEndResize(wxHeaderCtrlEvent& event)
{
if ( !event.IsCancelled() )
{
const unsigned col = event.GetColumn();
GetColumn(col).SetWidth(event.GetWidth());
GetOwner()->OnColumnChange(col);
}
}
void OnEndReorder(wxHeaderCtrlEvent& event)
{

View File

@@ -300,17 +300,19 @@ void wxHeaderCtrl::EndResizing(int xPhysical)
EndDragging();
const bool cancelled = xPhysical == -1;
// if dragging was cancelled we must have already lost the mouse capture so
// don't try to release it
if ( xPhysical != -1 )
if ( !cancelled )
ReleaseMouse();
wxHeaderCtrlEvent event(wxEVT_COMMAND_HEADER_END_RESIZE, GetId());
wxHeaderCtrlEvent event(cancelled ? wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED
: wxEVT_COMMAND_HEADER_END_RESIZE,
GetId());
event.SetEventObject(this);
event.SetColumn(m_colBeingResized);
if ( xPhysical == -1 )
event.SetCancelled();
else
if ( !cancelled )
event.SetWidth(ConstrainByMinWidth(m_colBeingResized, xPhysical));
GetEventHandler()->ProcessEvent(event);

View File

@@ -325,7 +325,6 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
int idx = nmhdr->iItem;
int width = 0;
int order = -1;
bool cancelled = false;
bool veto = false;
const UINT code = nmhdr->hdr.code;
switch ( code )
@@ -432,7 +431,7 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
break;
case NM_RELEASEDCAPTURE:
cancelled = true;
evtType = wxEVT_COMMAND_HEADER_DRAGGING_CANCELLED;
break;
}
@@ -446,8 +445,6 @@ bool wxHeaderCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
event.SetWidth(width);
if ( order != -1 )
event.SetNewOrder(order);
if ( cancelled )
event.SetCancelled();
if ( GetEventHandler()->ProcessEvent(event) )
{