// wxWin macros
// ----------------------------------------------------------------------------
-#if wxUSE_EXTENDED_RTTI
-WX_DEFINE_FLAGS( wxTreeCtrlStyle )
-
-wxBEGIN_FLAGS( wxTreeCtrlStyle )
- // new style border flags, we put them first to
- // use them for streaming out
- wxFLAGS_MEMBER(wxBORDER_SIMPLE)
- wxFLAGS_MEMBER(wxBORDER_SUNKEN)
- wxFLAGS_MEMBER(wxBORDER_DOUBLE)
- wxFLAGS_MEMBER(wxBORDER_RAISED)
- wxFLAGS_MEMBER(wxBORDER_STATIC)
- wxFLAGS_MEMBER(wxBORDER_NONE)
-
- // old style border flags
- wxFLAGS_MEMBER(wxSIMPLE_BORDER)
- wxFLAGS_MEMBER(wxSUNKEN_BORDER)
- wxFLAGS_MEMBER(wxDOUBLE_BORDER)
- wxFLAGS_MEMBER(wxRAISED_BORDER)
- wxFLAGS_MEMBER(wxSTATIC_BORDER)
- wxFLAGS_MEMBER(wxBORDER)
-
- // standard window styles
- wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
- wxFLAGS_MEMBER(wxCLIP_CHILDREN)
- wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
- wxFLAGS_MEMBER(wxWANTS_CHARS)
- wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
- wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
- wxFLAGS_MEMBER(wxVSCROLL)
- wxFLAGS_MEMBER(wxHSCROLL)
-
- wxFLAGS_MEMBER(wxTR_EDIT_LABELS)
- wxFLAGS_MEMBER(wxTR_NO_BUTTONS)
- wxFLAGS_MEMBER(wxTR_HAS_BUTTONS)
- wxFLAGS_MEMBER(wxTR_TWIST_BUTTONS)
- wxFLAGS_MEMBER(wxTR_NO_LINES)
- wxFLAGS_MEMBER(wxTR_FULL_ROW_HIGHLIGHT)
- wxFLAGS_MEMBER(wxTR_LINES_AT_ROOT)
- wxFLAGS_MEMBER(wxTR_HIDE_ROOT)
- wxFLAGS_MEMBER(wxTR_ROW_LINES)
- wxFLAGS_MEMBER(wxTR_HAS_VARIABLE_ROW_HEIGHT)
- wxFLAGS_MEMBER(wxTR_SINGLE)
- wxFLAGS_MEMBER(wxTR_MULTIPLE)
-#if WXWIN_COMPATIBILITY_2_8
- wxFLAGS_MEMBER(wxTR_EXTENDED)
-#endif
- wxFLAGS_MEMBER(wxTR_DEFAULT_STYLE)
-
-wxEND_FLAGS( wxTreeCtrlStyle )
-
-IMPLEMENT_DYNAMIC_CLASS_XTI(wxTreeCtrl, wxControl,"wx/treectrl.h")
-
-wxBEGIN_PROPERTIES_TABLE(wxTreeCtrl)
- wxEVENT_PROPERTY( TextUpdated , wxEVT_COMMAND_TEXT_UPDATED , wxCommandEvent )
- wxEVENT_RANGE_PROPERTY( TreeEvent , wxEVT_COMMAND_TREE_BEGIN_DRAG , wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK , wxTreeEvent )
- wxPROPERTY_FLAGS( WindowStyle , wxTreeCtrlStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
-wxEND_PROPERTIES_TABLE()
-
-wxBEGIN_HANDLERS_TABLE(wxTreeCtrl)
-wxEND_HANDLERS_TABLE()
-
-wxCONSTRUCTOR_5( wxTreeCtrl , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle )
-#else
-IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl)
-#endif
-
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// leave itemNew invalid
}
- // in spite of the docs (MSDN Jan 99 edition), we don't seem to receive
- // the notification from the control (i.e. TVN_SELCHANG{ED|ING}), so
- // send them ourselves
-
+ // Recent versions of comctl32.dll send TVN_SELCHANG{ED,ING} events
+ // when we call TreeView_SelectItem() but apparently some old ones did
+ // not so send the events ourselves and ignore those generated by
+ // TreeView_SelectItem() if m_changingSelection is set.
wxTreeEvent
changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, itemNew);
changingEvent.SetOldItem(itemOld);
if ( IsTreeEventAllowed(changingEvent) )
{
+ TempSetter set(m_changingSelection);
+
if ( !TreeView_SelectItem(GetHwnd(), HITEM(itemNew)) )
{
wxLogLastError(wxT("TreeView_SelectItem"));
}
else // ok
{
- SetFocusedItem(item);
+ ::SetFocus(GetHwnd(), HITEM(item));
wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED,
this, itemNew);
bool wxTreeCtrl::MSWHandleTreeKeyDownEvent(WXWPARAM wParam, WXLPARAM lParam)
{
wxTreeEvent keyEvent(wxEVT_COMMAND_TREE_KEY_DOWN, this);
-
- int keyCode = wxCharCodeMSWToWX(wParam);
-
- if ( !keyCode )
- {
- // wxCharCodeMSWToWX() returns 0 to indicate that this is a
- // simple ASCII key
- keyCode = wParam;
- }
-
- keyEvent.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN, keyCode,
- lParam, wParam);
+ keyEvent.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN, wParam, lParam);
bool processed = HandleTreeEvent(keyEvent);
}
// create the event
- wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_MENU, this, item);
+ if ( item.IsOk() )
+ {
+ wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_MENU, this, item);
- event.m_pointDrag = pt;
+ event.m_pointDrag = pt;
- if ( HandleTreeEvent(event) )
- processed = true;
- //else: continue with generating wxEVT_CONTEXT_MENU in base class code
+ if ( HandleTreeEvent(event) )
+ processed = true;
+ //else: continue with generating wxEVT_CONTEXT_MENU in base class code
+ }
}
else if ( (nMsg >= WM_MOUSEFIRST) && (nMsg <= WM_MOUSELAST) )
{
// we have to handle both messages:
case TVN_SELCHANGEDA:
case TVN_SELCHANGEDW:
- if ( !HasFlag(wxTR_MULTIPLE) || !m_changingSelection )
+ if ( !m_changingSelection )
{
eventType = wxEVT_COMMAND_TREE_SEL_CHANGED;
}
case TVN_SELCHANGINGA:
case TVN_SELCHANGINGW:
- if ( !HasFlag(wxTR_MULTIPLE) || !m_changingSelection )
+ if ( !m_changingSelection )
{
if ( eventType == wxEVT_NULL )
eventType = wxEVT_COMMAND_TREE_SEL_CHANGING;
//
// to avoid such surprises, we force the generation of focus events
// now, before we generate the selection change ones
- SetFocus();
+ if ( !m_changingSelection )
+ SetFocus();
break;
// instead of explicitly checking for _WIN32_IE, check if the