X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5f6b52ab37166b49757b234d345fef358c33ecd..315ebf688c0e69bed47cd3149158198b781b5f65:/src/msw/treectrl.cpp diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index f64ea0651c..26ba49eea1 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "treectrl.h" #endif @@ -44,36 +44,8 @@ #include "wx/msw/treectrl.h" #include "wx/msw/dragimag.h" -#ifdef __GNUWIN32_OLD__ - #include "wx/msw/gnuwin32/extra.h" -#endif - -#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)) - #include -#endif - -// Bug in headers, sometimes -#ifndef TVIS_FOCUSED - #define TVIS_FOCUSED 0x0001 -#endif - -#ifndef TV_FIRST - #define TV_FIRST 0x1100 -#endif - -#ifndef TVS_CHECKBOXES - #define TVS_CHECKBOXES 0x0100 -#endif - -#ifndef TVS_FULLROWSELECT - #define TVS_FULLROWSELECT 0x1000 -#endif - -// old headers might miss these messages (comctl32.dll 4.71+ only) -#ifndef TVM_SETBKCOLOR - #define TVM_SETBKCOLOR (TV_FIRST + 29) - #define TVM_SETTEXTCOLOR (TV_FIRST + 30) -#endif +// include "properly" +#include "wx/msw/wrapcctl.h" // macros to hide the cast ugliness // -------------------------------- @@ -398,6 +370,8 @@ public: private: wxArrayTreeItemIds& m_selections; + + DECLARE_NO_COPY_CLASS(TraverseSelections) }; // internal class for counting tree items @@ -425,6 +399,8 @@ public: private: size_t m_count; + + DECLARE_NO_COPY_CLASS(TraverseCounter) }; // ---------------------------------------------------------------------------- @@ -494,7 +470,69 @@ private: // 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) + wxFLAGS_MEMBER(wxTR_EXTENDED) + 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 , , 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 @@ -636,6 +674,11 @@ bool wxTreeCtrl::Create(wxWindow *parent, wstyle |= TVS_CHECKBOXES; #endif // wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE +#ifndef __WXWINCE__ + // Need so that TVN_GETINFOTIP messages will be sent + wstyle |= TVS_INFOTIP; +#endif + // Create the tree control. if ( !MSWCreateControl(WC_TREEVIEW, wstyle) ) return false; @@ -1298,8 +1341,18 @@ bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const // the HTREEITEM with TVM_GETITEMRECT *(HTREEITEM *)&rect = HITEM(item); - // false means get item rect for the whole item, not only text - return SendMessage(GetHwnd(), TVM_GETITEMRECT, false, (LPARAM)&rect) != 0; + // true means to get rect for just the text, not the whole line + if ( !::SendMessage(GetHwnd(), TVM_GETITEMRECT, true, (LPARAM)&rect) ) + { + // if TVM_GETITEMRECT returned false, then the item is definitely not + // visible (because its parent is not expanded) + return false; + } + + // however if it returned true, the item might still be outside the + // currently visible part of the tree, test for it (notice that partly + // visible means visible here) + return rect.bottom > 0 && rect.top < GetClientSize().y; } bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const @@ -2086,10 +2139,10 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) switch ( nMsg ) { case WM_RBUTTONDOWN: - // if the item we are about to right click on - // is not already select, remove the entire - // previous selection - if (!::IsItemSelected(GetHwnd(), htItem)) + // if the item we are about to right click on is not already + // selected or if we click outside of any item, remove the + // entire previous selection + if ( !htItem || !::IsItemSelected(GetHwnd(), htItem) ) { UnselectAll(); } @@ -2407,17 +2460,34 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) event.m_item = info->item.hItem; event.m_label = info->item.pszText; - if (info->item.pszText == NULL) - { - event.m_editCancelled = true; - } - else - { - event.m_editCancelled = false; - } + event.m_editCancelled = info->item.pszText == NULL; + break; + } + +#ifndef __WXWINCE__ + // These *must* not be removed or TVN_GETINFOTIP will + // not be processed each time the mouse is moved + // and the tooltip will only ever update once. + case TTN_NEEDTEXTA: + case TTN_NEEDTEXTW: + { + *result = 0; + break; } + case TVN_GETINFOTIP: + { + eventType = wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP; + NMTVGETINFOTIP *info = (NMTVGETINFOTIP*)lParam; + + // Which item are we trying to get a tooltip for? + event.m_item = info->hItem; + + break; + } +#endif + case TVN_GETDISPINFO: eventType = wxEVT_COMMAND_TREE_GET_INFO; // fall through @@ -2539,7 +2609,9 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) } break; -#if defined(_WIN32_IE) && _WIN32_IE >= 0x300 && !wxUSE_COMCTL32_SAFELY && !( defined(__GNUWIN32__) && !wxCHECK_W32API_VERSION( 1, 0 ) ) + // instead of explicitly checking for _WIN32_IE, check if the + // required symbols are available in the headers +#if defined(CDDS_PREPAINT) && !wxUSE_COMCTL32_SAFELY case NM_CUSTOMDRAW: { LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)lParam; @@ -2567,60 +2639,42 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) wxTreeItemAttr * const attr = it->second; - HFONT hFont; - if ( attr->HasFont() ) - { - hFont = GetHfontOf(attr->GetFont()); - } - else - { - hFont = 0; - } - - wxColour colText; - if ( attr->HasTextColour() ) - { - colText = attr->GetTextColour(); - } - else - { - colText = GetForegroundColour(); - } - - // selection colours should override ours - if ( nmcd.uItemState & CDIS_SELECTED ) - { - lptvcd->clrTextBk = - ::GetSysColor(COLOR_HIGHLIGHT); - lptvcd->clrText = - ::GetSysColor(COLOR_HIGHLIGHTTEXT); - } - else // !selected + // selection colours should override ours, + // otherwise it is too confusing ot the user + if ( !(nmcd.uItemState & CDIS_SELECTED) ) { wxColour colBack; if ( attr->HasBackgroundColour() ) { colBack = attr->GetBackgroundColour(); + lptvcd->clrTextBk = wxColourToRGB(colBack); } - else + } + + // but we still want to keep the special foreground + // colour when we don't have focus (we can't keep + // it when we do, it would usually be unreadable on + // the almost inverted bg colour...) + if ( !(nmcd.uItemState & CDIS_SELECTED) || + FindFocus() != this ) + { + wxColour colText; + if ( attr->HasTextColour() ) { - colBack = GetBackgroundColour(); + colText = attr->GetTextColour(); + lptvcd->clrText = wxColourToRGB(colText); } - - lptvcd->clrText = wxColourToRGB(colText); - lptvcd->clrTextBk = wxColourToRGB(colBack); } - // note that if we wanted to set colours for - // individual columns (subitems), we would have - // returned CDRF_NOTIFYSUBITEMREDRAW from here - if ( hFont ) + if ( attr->HasFont() ) { + HFONT hFont = GetHfontOf(attr->GetFont()); + ::SelectObject(nmcd.hdc, hFont); *result = CDRF_NEWFONT; } - else + else // no specific font { *result = CDRF_DODEFAULT; } @@ -2634,7 +2688,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) // we always process it return true; -#endif // _WIN32_IE >= 0x300 +#endif // have owner drawn support in headers case NM_CLICK: { @@ -2780,6 +2834,18 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) DeleteTextCtrl(); break; +#ifndef __WXWINCE__ + case TVN_GETINFOTIP: + { + // If the user permitted a tooltip change, change it + if (event.IsAllowed()) + { + SetToolTip(event.m_label); + } + } + break; +#endif + case TVN_SELCHANGING: case TVN_ITEMEXPANDING: // return true to prevent the action from happening