X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/73974df1f951f176f592fd900352c41281eb5df2..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/msw/treectrl.cpp diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 530535f27a..aebe08ac39 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -67,7 +67,10 @@ // ---------------------------------------------------------------------------- // a convenient wrapper around TV_ITEM struct which adds a ctor +#ifdef __VISUALC__ #pragma warning( disable : 4097 ) +#endif + struct wxTreeViewItem : public TV_ITEM { wxTreeViewItem(const wxTreeItemId& item, // the item handle @@ -80,7 +83,10 @@ struct wxTreeViewItem : public TV_ITEM hItem = (HTREEITEM) (WXHTREEITEM) item; } }; + +#ifdef __VISUALC__ #pragma warning( default : 4097 ) +#endif // a class which encapsulates the tree traversal logic: it vists all (unless // OnVisit() returns FALSE) items under the given one @@ -309,10 +315,10 @@ bool wxTreeCtrl::Create(wxWindow *parent, if ( m_windowStyle & wxTR_LINES_AT_ROOT ) wstyle |= TVS_LINESATROOT; -#if !defined( __GNUWIN32__ ) && !defined( __BORLANDC__ ) && !defined(wxUSE_NORLANDER_HEADERS) +#if !defined( __GNUWIN32__ ) && !defined( __BORLANDC__ ) && !defined( __WATCOMC__ ) && !defined(wxUSE_NORLANDER_HEADERS) // 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 -#if !defined(__VISUALC__) || (__VISUALC__ != 1010) +#if !defined(__VISUALC__) || (__VISUALC__ > 1010) if ( m_windowStyle & wxTR_MULTIPLE ) wstyle |= TVS_CHECKBOXES; #endif @@ -352,7 +358,7 @@ bool wxTreeCtrl::Create(wxWindow *parent, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_CHECKED) ) { - wxLogLastError(T("DrawFrameControl(check)")); + wxLogLastError(wxT("DrawFrameControl(check)")); } bmp.SetHBITMAP((WXHBITMAP)hbmpCheck); @@ -362,7 +368,7 @@ bool wxTreeCtrl::Create(wxWindow *parent, DFC_BUTTON, DFCS_BUTTONCHECK) ) { - wxLogLastError(T("DrawFrameControl(uncheck)")); + wxLogLastError(wxT("DrawFrameControl(uncheck)")); } bmp.SetHBITMAP((WXHBITMAP)hbmpCheck); @@ -480,7 +486,7 @@ wxString wxTreeCtrl::GetItemText(const wxTreeItemId& item) const if ( !DoGetItem(&tvItem) ) { // don't return some garbage which was on stack, but an empty string - buf[0] = T('\0'); + buf[0] = wxT('\0'); } return wxString(buf); @@ -555,7 +561,7 @@ int wxTreeCtrl::GetItemImage(const wxTreeItemId& item, switch ( which ) { default: - wxFAIL_MSG( T("unknown tree item image type") ); + wxFAIL_MSG( wxT("unknown tree item image type") ); case wxTreeItemIcon_Normal: mask = TVIF_IMAGE; @@ -583,7 +589,7 @@ void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image, switch ( which ) { default: - wxFAIL_MSG( T("unknown tree item image type") ); + wxFAIL_MSG( wxT("unknown tree item image type") ); case wxTreeItemIcon_Normal: imageNormal = image; @@ -659,7 +665,7 @@ void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data) } else { - wxFAIL_MSG( T("failed to change tree items data") ); + wxFAIL_MSG( wxT("failed to change tree items data") ); } } else @@ -676,7 +682,7 @@ void wxTreeCtrl::SetIndirectItemData(const wxTreeItemId& item, // to crash too because the code elsewhere supposes that the pointer the // wxTreeItemIndirectData has is a real wxItemData and not // wxTreeItemIndirectData as well - wxASSERT_MSG( !HasIndirectData(item), T("setting indirect data twice?") ); + wxASSERT_MSG( !HasIndirectData(item), wxT("setting indirect data twice?") ); SetItemData(item, (wxTreeItemData *)data); @@ -768,7 +774,7 @@ wxTreeItemId wxTreeCtrl::GetRootItem() const wxTreeItemId wxTreeCtrl::GetSelection() const { wxCHECK_MSG( !(m_windowStyle & wxTR_MULTIPLE), (WXHTREEITEM)0, - T("this only works with single selection controls") ); + wxT("this only works with single selection controls") ); return wxTreeItemId((WXHTREEITEM) TreeView_GetSelection(GetHwnd())); } @@ -830,7 +836,7 @@ wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const { - wxASSERT_MSG( IsVisible(item), T("The item you call GetNextVisible() " + wxASSERT_MSG( IsVisible(item), wxT("The item you call GetNextVisible() " "for must be visible itself!")); return wxTreeItemId((WXHTREEITEM) TreeView_GetNextVisible(GetHwnd(), (HTREEITEM) (WXHTREEITEM) item)); @@ -838,7 +844,7 @@ wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const { - wxASSERT_MSG( IsVisible(item), T("The item you call GetPrevVisible() " + wxASSERT_MSG( IsVisible(item), wxT("The item you call GetPrevVisible() " "for must be visible itself!")); return wxTreeItemId((WXHTREEITEM) TreeView_GetPrevVisible(GetHwnd(), (HTREEITEM) (WXHTREEITEM) item)); @@ -1036,7 +1042,7 @@ void wxTreeCtrl::DoExpand(const wxTreeItemId& item, int flag) flag == (TVE_COLLAPSE | TVE_COLLAPSERESET) || flag == TVE_EXPAND || flag == TVE_TOGGLE, - T("Unknown flag in wxTreeCtrl::DoExpand") ); + wxT("Unknown flag in wxTreeCtrl::DoExpand") ); // TreeView_Expand doesn't send TVN_ITEMEXPAND(ING) messages, so we must // emulate them. This behaviour has changed slightly with comctl32.dll @@ -1096,7 +1102,7 @@ void wxTreeCtrl::ExpandItem(const wxTreeItemId& item, int action) void wxTreeCtrl::Unselect() { - wxASSERT_MSG( !(m_windowStyle & wxTR_MULTIPLE), T("doesn't make sense") ); + wxASSERT_MSG( !(m_windowStyle & wxTR_MULTIPLE), wxT("doesn't make sense") ); // just remove the selection SelectItem(wxTreeItemId((WXHTREEITEM) 0)); @@ -1274,7 +1280,7 @@ static int CALLBACK TreeView_CompareCallback(wxTreeItemData *pItem1, wxTreeCtrl *tree) { wxCHECK_MSG( pItem1 && pItem2, 0, - T("sorting tree without data doesn't make sense") ); + wxT("sorting tree without data doesn't make sense") ); return tree->OnCompareItems(pItem1->GetId(), pItem2->GetId()); } @@ -1341,6 +1347,25 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) switch ( hdr->code ) { + case NM_RCLICK: + { + if ( wxControl::MSWOnNotify(idCtrl, lParam, result) ) + return TRUE; + + TV_HITTESTINFO tvhti; + ::GetCursorPos(&(tvhti.pt)); + ::ScreenToClient(GetHwnd(),&(tvhti.pt)); + if ( TreeView_HitTest(GetHwnd(),&tvhti) ) + { + if( tvhti.flags & TVHT_ONITEM ) + { + event.m_item = (WXHTREEITEM) tvhti.hItem; + eventType=wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK; + } + } + break; + } + case TVN_BEGINDRAG: eventType = wxEVT_COMMAND_TREE_BEGIN_DRAG; // fall through @@ -1384,6 +1409,8 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) event.m_item = (WXHTREEITEM)info->item.hItem; event.m_label = info->item.pszText; + if (info->item.pszText == NULL) + return FALSE; break; } @@ -1423,11 +1450,11 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) break; default: - wxLogDebug(T("unexpected code %d in TVN_ITEMEXPAND " + wxLogDebug(wxT("unexpected code %d in TVN_ITEMEXPAND " "message"), tv->action); } - bool ing = (hdr->code == TVN_ITEMEXPANDING); + bool ing = ((int)hdr->code == TVN_ITEMEXPANDING); eventType = g_events[expand][ing]; event.m_item = (WXHTREEITEM) tv->itemNew.hItem;