merged 2.2 branch
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7748 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -29,6 +29,9 @@
|
||||
|
||||
#include "wx/msw/private.h"
|
||||
|
||||
// Set this to 1 to be _absolutely_ sure that repainting will work for all comctl32.dll versions
|
||||
#define wxUSE_COMCTL32_SAFELY 0
|
||||
|
||||
// Mingw32 is a bit mental even though this is done in winundef
|
||||
#ifdef GetFirstChild
|
||||
#undef GetFirstChild
|
||||
@@ -112,7 +115,7 @@ static bool IsItemSelected(HWND hwndTV, HTREEITEM hItem)
|
||||
|
||||
if ( !TreeView_GetItem(hwndTV, &tvi) )
|
||||
{
|
||||
wxLogLastError("TreeView_GetItem");
|
||||
wxLogLastError(wxT("TreeView_GetItem"));
|
||||
}
|
||||
|
||||
return (tvi.state & TVIS_SELECTED) != 0;
|
||||
@@ -128,7 +131,7 @@ static void SelectItem(HWND hwndTV, HTREEITEM hItem, bool select = TRUE)
|
||||
|
||||
if ( TreeView_SetItem(hwndTV, &tvi) == -1 )
|
||||
{
|
||||
wxLogLastError("TreeView_SetItem");
|
||||
wxLogLastError(wxT("TreeView_SetItem"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -516,7 +519,7 @@ bool wxTreeCtrl::Create(wxWindow *parent,
|
||||
return FALSE;
|
||||
|
||||
DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP |
|
||||
TVS_HASLINES | TVS_SHOWSELALWAYS;
|
||||
TVS_HASLINES | TVS_SHOWSELALWAYS /* | WS_CLIPSIBLINGS */;
|
||||
|
||||
if ( m_windowStyle & wxTR_HAS_BUTTONS )
|
||||
wstyle |= TVS_HASBUTTONS;
|
||||
@@ -545,17 +548,23 @@ bool wxTreeCtrl::Create(wxWindow *parent,
|
||||
if ( !MSWCreateControl(WC_TREEVIEW, wstyle) )
|
||||
return FALSE;
|
||||
|
||||
#if 0
|
||||
#if wxUSE_COMCTL32_SAFELY
|
||||
wxWindow::SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
|
||||
wxWindow::SetForegroundColour(wxWindow::GetParent()->GetForegroundColour());
|
||||
#elif 1
|
||||
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
|
||||
SetForegroundColour(wxWindow::GetParent()->GetForegroundColour());
|
||||
#else
|
||||
// This works around a bug in the Windows tree control whereby for some versions
|
||||
// of comctrl32, setting any colour actually draws the background in black.
|
||||
// This will initialise the background to the system colour.
|
||||
// THIS FIX NOW REVERTED since it caused problems on _other_ systems.
|
||||
// Assume the user has an updated comctl32.dll.
|
||||
::SendMessage(GetHwnd(), TVM_SETBKCOLOR, 0,-1);
|
||||
wxWindow::SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
|
||||
SetForegroundColour(wxWindow::GetParent()->GetForegroundColour());
|
||||
#endif
|
||||
|
||||
SetForegroundColour(wxWindow::GetParent()->GetForegroundColour());
|
||||
|
||||
// VZ: this is some experimental code which may be used to get the
|
||||
// TVS_CHECKBOXES style functionality for comctl32.dll < 4.71.
|
||||
@@ -643,7 +652,7 @@ bool wxTreeCtrl::DoGetItem(wxTreeViewItem* tvItem) const
|
||||
{
|
||||
if ( !TreeView_GetItem(GetHwnd(), tvItem) )
|
||||
{
|
||||
wxLogLastError("TreeView_GetItem");
|
||||
wxLogLastError(wxT("TreeView_GetItem"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -655,7 +664,7 @@ void wxTreeCtrl::DoSetItem(wxTreeViewItem* tvItem)
|
||||
{
|
||||
if ( TreeView_SetItem(GetHwnd(), tvItem) == -1 )
|
||||
{
|
||||
wxLogLastError("TreeView_SetItem");
|
||||
wxLogLastError(wxT("TreeView_SetItem"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -716,20 +725,24 @@ size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item,
|
||||
|
||||
bool wxTreeCtrl::SetBackgroundColour(const wxColour &colour)
|
||||
{
|
||||
#if !wxUSE_COMCTL32_SAFELY
|
||||
if ( !wxWindowBase::SetBackgroundColour(colour) )
|
||||
return FALSE;
|
||||
|
||||
SendMessage(GetHwnd(), TVM_SETBKCOLOR, 0, colour.GetPixel());
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool wxTreeCtrl::SetForegroundColour(const wxColour &colour)
|
||||
{
|
||||
#if !wxUSE_COMCTL32_SAFELY
|
||||
if ( !wxWindowBase::SetForegroundColour(colour) )
|
||||
return FALSE;
|
||||
|
||||
SendMessage(GetHwnd(), TVM_SETTEXTCOLOR, 0, colour.GetPixel());
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1151,16 +1164,14 @@ wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const
|
||||
|
||||
wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const
|
||||
{
|
||||
wxASSERT_MSG( IsVisible(item), wxT("The item you call GetNextVisible() "
|
||||
"for must be visible itself!"));
|
||||
wxASSERT_MSG( IsVisible(item), wxT("The item you call GetNextVisible() for must be visible itself!"));
|
||||
|
||||
return wxTreeItemId((WXHTREEITEM) TreeView_GetNextVisible(GetHwnd(), HITEM(item)));
|
||||
}
|
||||
|
||||
wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const
|
||||
{
|
||||
wxASSERT_MSG( IsVisible(item), wxT("The item you call GetPrevVisible() "
|
||||
"for must be visible itself!"));
|
||||
wxASSERT_MSG( IsVisible(item), wxT("The item you call GetPrevVisible() for must be visible itself!"));
|
||||
|
||||
return wxTreeItemId((WXHTREEITEM) TreeView_GetPrevVisible(GetHwnd(), HITEM(item)));
|
||||
}
|
||||
@@ -1228,6 +1239,11 @@ wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
|
||||
mask |= TVIF_TEXT;
|
||||
tvIns.item.pszText = (wxChar *)text.c_str(); // cast is ok
|
||||
}
|
||||
else
|
||||
{
|
||||
tvIns.item.pszText = NULL;
|
||||
tvIns.item.cchTextMax = 0;
|
||||
}
|
||||
|
||||
if ( image != -1 )
|
||||
{
|
||||
@@ -1258,7 +1274,7 @@ wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
|
||||
HTREEITEM id = (HTREEITEM) TreeView_InsertItem(GetHwnd(), &tvIns);
|
||||
if ( id == 0 )
|
||||
{
|
||||
wxLogLastError("TreeView_InsertItem");
|
||||
wxLogLastError(wxT("TreeView_InsertItem"));
|
||||
}
|
||||
|
||||
if ( data != NULL )
|
||||
@@ -1343,7 +1359,7 @@ void wxTreeCtrl::Delete(const wxTreeItemId& item)
|
||||
{
|
||||
if ( !TreeView_DeleteItem(GetHwnd(), HITEM(item)) )
|
||||
{
|
||||
wxLogLastError("TreeView_DeleteItem");
|
||||
wxLogLastError(wxT("TreeView_DeleteItem"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1366,7 +1382,7 @@ void wxTreeCtrl::DeleteChildren(const wxTreeItemId& item)
|
||||
{
|
||||
if ( !TreeView_DeleteItem(GetHwnd(), (HTREEITEM)children[n]) )
|
||||
{
|
||||
wxLogLastError("TreeView_DeleteItem");
|
||||
wxLogLastError(wxT("TreeView_DeleteItem"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1375,7 +1391,7 @@ void wxTreeCtrl::DeleteAllItems()
|
||||
{
|
||||
if ( !TreeView_DeleteAllItems(GetHwnd()) )
|
||||
{
|
||||
wxLogLastError("TreeView_DeleteAllItems");
|
||||
wxLogLastError(wxT("TreeView_DeleteAllItems"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1500,7 +1516,7 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item)
|
||||
{
|
||||
if ( !TreeView_SelectItem(GetHwnd(), HITEM(item)) )
|
||||
{
|
||||
wxLogLastError("TreeView_SelectItem");
|
||||
wxLogLastError(wxT("TreeView_SelectItem"));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1522,7 +1538,7 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
|
||||
{
|
||||
if ( !TreeView_SelectSetFirstVisible(GetHwnd(), HITEM(item)) )
|
||||
{
|
||||
wxLogLastError("TreeView_SelectSetFirstVisible");
|
||||
wxLogLastError(wxT("TreeView_SelectSetFirstVisible"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1924,25 +1940,6 @@ 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
|
||||
@@ -2038,8 +2035,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
break;
|
||||
|
||||
default:
|
||||
wxLogDebug(wxT("unexpected code %d in TVN_ITEMEXPAND "
|
||||
"message"), tv->action);
|
||||
wxLogDebug(wxT("unexpected code %d in TVN_ITEMEXPAND message"), tv->action);
|
||||
}
|
||||
|
||||
bool ing = ((int)hdr->code == TVN_ITEMEXPANDING);
|
||||
@@ -2091,7 +2087,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
}
|
||||
break;
|
||||
|
||||
#if defined(_WIN32_IE) && _WIN32_IE >= 0x300
|
||||
#if defined(_WIN32_IE) && _WIN32_IE >= 0x300 && !wxUSE_COMCTL32_SAFELY
|
||||
case NM_CUSTOMDRAW:
|
||||
{
|
||||
LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)lParam;
|
||||
@@ -2188,6 +2184,27 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
break;
|
||||
#endif // _WIN32_IE >= 0x300
|
||||
|
||||
case NM_DBLCLK:
|
||||
case NM_RCLICK:
|
||||
{
|
||||
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 = (int)hdr->code == NM_DBLCLK
|
||||
? wxEVT_COMMAND_TREE_ITEM_ACTIVATED
|
||||
: wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
// fall through
|
||||
|
||||
default:
|
||||
return wxControl::MSWOnNotify(idCtrl, lParam, result);
|
||||
}
|
||||
@@ -2200,6 +2217,14 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
// post processing
|
||||
switch ( hdr->code )
|
||||
{
|
||||
case NM_DBLCLK:
|
||||
// we translate NM_DBLCLK into ACTIVATED event, so don't interpret
|
||||
// the return code of this event handler as the return value for
|
||||
// NM_DBLCLK - otherwise, double clicking the item to toggle its
|
||||
// expanded status would never work
|
||||
*result = FALSE;
|
||||
break;
|
||||
|
||||
case TVN_BEGINDRAG:
|
||||
case TVN_BEGINRDRAG:
|
||||
if ( event.IsAllowed() )
|
||||
|
Reference in New Issue
Block a user