send END_EDIT label if label editing is cancelled
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24111 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -79,6 +79,7 @@ All (GUI):
|
||||
- added wxListCtrl::GetViewRect()
|
||||
- added wxTextCtrl::MarkDirty()
|
||||
- wxToolBar::ToggleTool() now works for radio buttons (Dag <20>gren)
|
||||
- wxListCtrl now sends an END_LABEL event if editing was cancelled, too
|
||||
- bug in wxRect ctor from two [out of order] wxPoints fixed (Steve Cornett)
|
||||
|
||||
wxMSW:
|
||||
@@ -90,6 +91,7 @@ wxMSW:
|
||||
- several fixes to owner drawn menu items (Christian Sturmlechner)
|
||||
- wxGauge now supports full 32 bit range (Miroslav Rajcic)
|
||||
- make it possible to give focus to the notebook tabs (Hajo Kirchhoff)
|
||||
- MDI child frames are not always resizeable any more (Andrei Fortuna)
|
||||
|
||||
wxGTK:
|
||||
|
||||
|
@@ -26,8 +26,6 @@ functions that take a wxListEvent argument.
|
||||
\twocolitem{{\bf EVT\_LIST\_END\_LABEL\_EDIT(id, func)}}{Finish editing a label. This can be prevented by calling \helpref{Veto()}{wxnotifyeventveto}.}
|
||||
\twocolitem{{\bf EVT\_LIST\_DELETE\_ITEM(id, func)}}{Delete an item.}
|
||||
\twocolitem{{\bf EVT\_LIST\_DELETE\_ALL\_ITEMS(id, func)}}{Delete all items.}
|
||||
%\twocolitem{{\bf EVT\_LIST\_GET\_INFO(id, func)}}{Request information from the application, usually the item text.}
|
||||
%\twocolitem{{\bf EVT\_LIST\_SET\_INFO(id, func)}}{Information is being supplied (not implemented).}
|
||||
\twocolitem{{\bf EVT\_LIST\_ITEM\_SELECTED(id, func)}}{The item has been selected.}
|
||||
\twocolitem{{\bf EVT\_LIST\_ITEM\_DESELECTED(id, func)}}{The item has been deselected.}
|
||||
\twocolitem{{\bf EVT\_LIST\_ITEM\_ACTIVATED(id, func)}}{The item has been activated (ENTER or double click).}
|
||||
@@ -50,12 +48,14 @@ functions that take a wxListEvent argument.
|
||||
|
||||
\latexignore{\rtfignore{\wxheading{Members}}}
|
||||
|
||||
|
||||
\membersection{wxListEvent::wxListEvent}
|
||||
|
||||
\func{}{wxListEvent}{\param{WXTYPE }{commandType = 0}, \param{int }{id = 0}}
|
||||
|
||||
Constructor.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetCacheFrom}\label{wxlisteventgetcachefrom}
|
||||
|
||||
\constfunc{long}{GetCacheFrom}{\void}
|
||||
@@ -63,6 +63,7 @@ Constructor.
|
||||
For {\tt EVT\_LIST\_CACHE\_HINT} event only: return the first item which the
|
||||
list control advises us to cache.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetCacheTo}\label{wxlisteventgetcacheto}
|
||||
|
||||
\constfunc{long}{GetCacheTo}{\void}
|
||||
@@ -70,18 +71,21 @@ list control advises us to cache.
|
||||
For {\tt EVT\_LIST\_CACHE\_HINT} event only: return the last item (inclusive)
|
||||
which the list control advises us to cache.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetKeyCode}\label{wxlisteventgetkeycode}
|
||||
|
||||
\constfunc{int}{GetKeyCode}{\void}
|
||||
|
||||
Key code if the event is a keypress event.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetIndex}\label{wxlisteventgetindex}
|
||||
|
||||
\constfunc{long}{GetIndex}{\void}
|
||||
|
||||
The item index.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetColumn}\label{wxlisteventgetcolumn}
|
||||
|
||||
\constfunc{int}{GetColumn}{\void}
|
||||
@@ -91,6 +95,7 @@ dragging events, it is the column to the left of the divider being dragged, for
|
||||
the column click events it may be $-1$ if the user clicked in the list control
|
||||
header outside any column.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetPoint}\label{wxlisteventgetpoint}
|
||||
|
||||
\constfunc{wxPoint}{GetPoint}{\void}
|
||||
@@ -98,11 +103,13 @@ header outside any column.
|
||||
The position of the mouse pointer if the event is a drag event.
|
||||
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetLabel}\label{wxlisteventgetlabel}
|
||||
|
||||
\constfunc{const wxString\&}{GetLabel}{\void}
|
||||
|
||||
The label.
|
||||
The (new) item label for \texttt{EVT\_LIST\_END\_LABEL\_EDIT} event.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetText}\label{wxlisteventgettext}
|
||||
|
||||
@@ -110,24 +117,28 @@ The label.
|
||||
|
||||
The text.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetImage}\label{wxlisteventgetimage}
|
||||
|
||||
\constfunc{int}{GetImage}{\void}
|
||||
|
||||
The image.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetData}\label{wxlisteventgetdata}
|
||||
|
||||
\constfunc{long}{GetData}{\void}
|
||||
|
||||
The data.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetMask}\label{wxlisteventgetmask}
|
||||
|
||||
\constfunc{long}{GetMask}{\void}
|
||||
|
||||
The mask.
|
||||
|
||||
|
||||
\membersection{wxListEvent::GetItem}\label{wxlisteventgetitem}
|
||||
|
||||
\constfunc{const wxListItem\&}{GetItem}{\void}
|
||||
@@ -135,3 +146,14 @@ The mask.
|
||||
An item object, used by some events. See also \helpref{wxListCtrl::SetItem}{wxlistctrlsetitem}.
|
||||
|
||||
|
||||
\membersection{wxListEvent::IsEditCancelled}\label{wxlisteventiseditcancelled}
|
||||
|
||||
\constfunc{bool}{IsEditCancelled}{\void}
|
||||
|
||||
This method only makes sense for \texttt{EVT\_LIST\_END\_LABEL\_EDIT} message
|
||||
and returns \true if it the label editing has been cancelled by the user
|
||||
(\helpref{GetLabel}{wxlisteventgetlabel} returns an empty string in this case
|
||||
but it doesn't allow to distinguish between really cancelling the edit and,
|
||||
admittedly rare, case when the user wants to rename it to an empty string0.
|
||||
|
||||
|
||||
|
@@ -350,6 +350,7 @@ public:
|
||||
, m_col(0)
|
||||
, m_pointDrag()
|
||||
, m_item()
|
||||
, m_editCancelled(false)
|
||||
{ }
|
||||
|
||||
wxListEvent(const wxListEvent& event)
|
||||
@@ -360,6 +361,7 @@ public:
|
||||
, m_col(event.m_col)
|
||||
, m_pointDrag(event.m_pointDrag)
|
||||
, m_item(event.m_item)
|
||||
, m_editCancelled(event.m_editCancelled)
|
||||
{ }
|
||||
|
||||
int GetKeyCode() const { return m_code; }
|
||||
@@ -377,6 +379,10 @@ public:
|
||||
long GetCacheFrom() const { return m_oldItemIndex; }
|
||||
long GetCacheTo() const { return m_itemIndex; }
|
||||
|
||||
// was label editing canceled? (for wxEVT_COMMAND_LIST_END_LABEL_EDIT only)
|
||||
bool IsEditCancelled() const { return m_editCancelled; }
|
||||
void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; }
|
||||
|
||||
#if WXWIN_COMPATIBILITY_2_2
|
||||
// these methods don't do anything at all
|
||||
long GetOldIndex() const { return 0; }
|
||||
@@ -397,6 +403,9 @@ public:
|
||||
|
||||
wxListItem m_item;
|
||||
|
||||
protected:
|
||||
bool m_editCancelled;
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxListEvent)
|
||||
};
|
||||
|
@@ -2834,25 +2834,12 @@ bool wxListMainWindow::OnRenameAccept(size_t itemEdit, const wxString& value)
|
||||
le.IsAllowed();
|
||||
}
|
||||
|
||||
#ifdef __VMS__ // Ignore unreacheable code
|
||||
# pragma message disable initnotreach
|
||||
#endif
|
||||
|
||||
void wxListMainWindow::OnRenameCancelled(size_t WXUNUSED(itemEdit))
|
||||
{
|
||||
// wxMSW seems not to notify the program about
|
||||
// cancelled label edits.
|
||||
return;
|
||||
|
||||
#if 0
|
||||
// above unconditional return cause warning about not reachable code
|
||||
|
||||
// let owner know that the edit was cancelled
|
||||
wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() );
|
||||
|
||||
// These only exist for wxTreeCtrl, which should probably be changed
|
||||
// le.m_editCancelled = TRUE;
|
||||
// le.m_label = wxEmptyString;
|
||||
le.SetEditCanceled(TRUE);
|
||||
|
||||
le.SetEventObject( GetParent() );
|
||||
le.m_itemIndex = itemEdit;
|
||||
@@ -2863,11 +2850,7 @@ void wxListMainWindow::OnRenameCancelled(size_t WXUNUSED(itemEdit))
|
||||
data->GetItem( 0, le.m_item );
|
||||
|
||||
GetEventHandler()->ProcessEvent( le );
|
||||
#endif
|
||||
}
|
||||
#ifdef __VMS__
|
||||
# pragma message enable initnotreach
|
||||
#endif
|
||||
|
||||
void wxListMainWindow::OnMouse( wxMouseEvent &event )
|
||||
{
|
||||
|
@@ -73,60 +73,77 @@ static void wxConvertToMSWListCol(int col, const wxListItem& item,
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// We have to handle both fooW and fooA notifications in several cases
|
||||
// because of broken commctl.dll and/or unicows.dll. This class is used to
|
||||
// because of broken comctl32.dll and/or unicows.dll. This class is used to
|
||||
// convert LV_ITEMA and LV_ITEMW to LV_ITEM (which is either LV_ITEMA or
|
||||
// LV_ITEMW depending on wxUSE_UNICODE setting), so that it can be processed
|
||||
// by wxConvertToMSWListItem().
|
||||
#if wxUSE_UNICODE
|
||||
#define LV_ITEM_NATIVE LV_ITEMW
|
||||
#define LV_ITEM_OTHER LV_ITEMA
|
||||
|
||||
#define LV_CONV_TO_WX cMB2WX
|
||||
#define LV_CONV_BUF wxMB2WXbuf
|
||||
#else // ANSI
|
||||
#define LV_ITEM_NATIVE LV_ITEMA
|
||||
#define LV_ITEM_OTHER LV_ITEMW
|
||||
|
||||
#define LV_CONV_TO_WX cWC2WX
|
||||
#define LV_CONV_BUF wxWC2WXbuf
|
||||
#endif // Unicode/ANSI
|
||||
|
||||
class wxLV_ITEM
|
||||
{
|
||||
public:
|
||||
// default ctor, use Init() later
|
||||
wxLV_ITEM() { m_buf = NULL; m_pItem = NULL; }
|
||||
|
||||
// init without conversion
|
||||
void Init(LV_ITEM_NATIVE& item)
|
||||
{
|
||||
wxASSERT_MSG( !m_pItem, _T("Init() called twice?") );
|
||||
|
||||
m_pItem = &item;
|
||||
}
|
||||
|
||||
// init with conversion
|
||||
void Init(LV_ITEM_OTHER& item)
|
||||
{
|
||||
// avoid unnecessary dynamic memory allocation, jjust make m_pItem
|
||||
// point to our own m_item
|
||||
|
||||
// memcpy() can't work if the struct sizes are different
|
||||
wxCOMPILE_TIME_ASSERT( sizeof(LV_ITEM_OTHER) == sizeof(LV_ITEM_NATIVE),
|
||||
CodeCantWorkIfDiffSizes);
|
||||
|
||||
memcpy(&m_item, &item, sizeof(LV_ITEM_NATIVE));
|
||||
|
||||
// convert text from ANSI to Unicod if necessary
|
||||
if ( (item.mask & LVIF_TEXT) && item.pszText )
|
||||
{
|
||||
m_buf = new LV_CONV_BUF(wxConvLocal.LV_CONV_TO_WX(item.pszText));
|
||||
m_item.pszText = (wxChar *)m_buf->data();
|
||||
}
|
||||
}
|
||||
|
||||
// ctor without conversion
|
||||
wxLV_ITEM(LV_ITEM_NATIVE& item) : m_buf(NULL), m_pItem(&item) { }
|
||||
|
||||
// ctor with conversion
|
||||
wxLV_ITEM(LV_ITEM_OTHER& item) : m_buf(NULL)
|
||||
{
|
||||
Init(item);
|
||||
}
|
||||
|
||||
~wxLV_ITEM() { delete m_buf; }
|
||||
operator LV_ITEM&() const { return *m_item; }
|
||||
|
||||
#if wxUSE_UNICODE
|
||||
wxLV_ITEM(LV_ITEMW &item) : m_buf(NULL), m_item(&item) {}
|
||||
wxLV_ITEM(LV_ITEMA &item)
|
||||
{
|
||||
m_item = new LV_ITEM((LV_ITEM&)item);
|
||||
if ( (item.mask & LVIF_TEXT) && item.pszText )
|
||||
{
|
||||
m_buf = new wxMB2WXbuf(wxConvLocal.cMB2WX(item.pszText));
|
||||
m_item->pszText = (wxChar*)m_buf->data();
|
||||
}
|
||||
else
|
||||
m_buf = NULL;
|
||||
}
|
||||
// conversion to the real LV_ITEM
|
||||
operator LV_ITEM_NATIVE&() const { return *m_pItem; }
|
||||
|
||||
private:
|
||||
wxMB2WXbuf *m_buf;
|
||||
LV_CONV_BUF *m_buf;
|
||||
|
||||
#else // !wxUSE_UNICODE
|
||||
wxLV_ITEM(LV_ITEMW &item)
|
||||
{
|
||||
m_item = new LV_ITEM((LV_ITEM&)item);
|
||||
|
||||
// the code below doesn't compile without wxUSE_WCHAR_T and as I don't
|
||||
// know if it's useful to have it at all (do we ever get Unicode
|
||||
// notifications in ANSI mode? I don't think so...) I'm not going to
|
||||
// write alternative implementation right now
|
||||
//
|
||||
// but if it is indeed used, we should simply directly use
|
||||
// ::WideCharToMultiByte() here
|
||||
#if wxUSE_WCHAR_T
|
||||
if ( (item.mask & LVIF_TEXT) && item.pszText )
|
||||
{
|
||||
m_buf = new wxWC2WXbuf(wxConvLocal.cWC2WX(item.pszText));
|
||||
m_item->pszText = (wxChar*)m_buf->data();
|
||||
}
|
||||
else
|
||||
#endif // wxUSE_WCHAR_T
|
||||
m_buf = NULL;
|
||||
}
|
||||
wxLV_ITEM(LV_ITEMA &item) : m_buf(NULL), m_item(&item) {}
|
||||
private:
|
||||
wxWC2WXbuf *m_buf;
|
||||
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
|
||||
|
||||
LV_ITEM *m_item;
|
||||
LV_ITEM_NATIVE *m_pItem;
|
||||
LV_ITEM_NATIVE m_item;
|
||||
|
||||
DECLARE_NO_COPY_CLASS(wxLV_ITEM)
|
||||
};
|
||||
@@ -1896,55 +1913,43 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
break;
|
||||
|
||||
// NB: we have to handle both *A and *W versions here because some
|
||||
// versions of comctl32.dll send ANSI message to an Unicode app
|
||||
// versions of comctl32.dll send ANSI messages even to the
|
||||
// Unicode windows
|
||||
case LVN_BEGINLABELEDITA:
|
||||
{
|
||||
eventType = wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT;
|
||||
wxLV_ITEM item(((LV_DISPINFOA *)lParam)->item);
|
||||
wxConvertFromMSWListItem(GetHwnd(), event.m_item, item);
|
||||
event.m_itemIndex = event.m_item.m_itemId;
|
||||
}
|
||||
break;
|
||||
case LVN_BEGINLABELEDITW:
|
||||
{
|
||||
wxLV_ITEM item;
|
||||
if ( nmhdr->code == LVN_BEGINLABELEDITA )
|
||||
{
|
||||
item.Init(((LV_DISPINFOA *)lParam)->item);
|
||||
}
|
||||
else // LVN_BEGINLABELEDITW
|
||||
{
|
||||
item.Init(((LV_DISPINFOW *)lParam)->item);
|
||||
}
|
||||
|
||||
eventType = wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT;
|
||||
wxLV_ITEM item(((LV_DISPINFOW *)lParam)->item);
|
||||
wxConvertFromMSWListItem(GetHwnd(), event.m_item, item);
|
||||
event.m_itemIndex = event.m_item.m_itemId;
|
||||
}
|
||||
break;
|
||||
|
||||
case LVN_ENDLABELEDITA:
|
||||
{
|
||||
eventType = wxEVT_COMMAND_LIST_END_LABEL_EDIT;
|
||||
wxLV_ITEM item(((LV_DISPINFOA *)lParam)->item);
|
||||
wxConvertFromMSWListItem(NULL, event.m_item, item);
|
||||
if ( ((LV_ITEM)item).pszText == NULL ||
|
||||
((LV_ITEM)item).iItem == -1 )
|
||||
{
|
||||
// don't keep a stale wxTextCtrl around
|
||||
if ( m_textCtrl )
|
||||
{
|
||||
// EDIT control will be deleted by the list control itself so
|
||||
// prevent us from deleting it as well
|
||||
m_textCtrl->UnsubclassWin();
|
||||
m_textCtrl->SetHWND(0);
|
||||
delete m_textCtrl;
|
||||
m_textCtrl = NULL;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
event.m_itemIndex = event.m_item.m_itemId;
|
||||
}
|
||||
break;
|
||||
case LVN_ENDLABELEDITW:
|
||||
{
|
||||
eventType = wxEVT_COMMAND_LIST_END_LABEL_EDIT;
|
||||
wxLV_ITEM item(((LV_DISPINFOW *)lParam)->item);
|
||||
wxConvertFromMSWListItem(NULL, event.m_item, item);
|
||||
if ( ((LV_ITEM)item).pszText == NULL ||
|
||||
((LV_ITEM)item).iItem == -1 )
|
||||
wxLV_ITEM item;
|
||||
if ( nmhdr->code == LVN_ENDLABELEDITA )
|
||||
{
|
||||
item.Init(((LV_DISPINFOA *)lParam)->item);
|
||||
}
|
||||
else // LVN_ENDLABELEDITW
|
||||
{
|
||||
item.Init(((LV_DISPINFOW *)lParam)->item);
|
||||
}
|
||||
|
||||
// was editing cancelled?
|
||||
const LV_ITEM& lvi = (LV_ITEM)item;
|
||||
if ( !lvi.pszText || lvi.iItem == -1 )
|
||||
{
|
||||
// don't keep a stale wxTextCtrl around
|
||||
if ( m_textCtrl )
|
||||
@@ -1956,9 +1961,12 @@ bool wxListCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
delete m_textCtrl;
|
||||
m_textCtrl = NULL;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
event.SetEditCanceled(true);
|
||||
}
|
||||
|
||||
eventType = wxEVT_COMMAND_LIST_END_LABEL_EDIT;
|
||||
wxConvertFromMSWListItem(NULL, event.m_item, item);
|
||||
event.m_itemIndex = event.m_item.m_itemId;
|
||||
}
|
||||
break;
|
||||
|
Reference in New Issue
Block a user