]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
XmNframeChildType is not in Lesstif if it was compiled with Motif 1.2
[wxWidgets.git] / src / msw / treectrl.cpp
index 84a8b01c20f42fdd61073a7b9593f7a5e9a14044..97348c58ff37e1e33813c0032730440762121236 100644 (file)
@@ -891,6 +891,20 @@ void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text)
     wxTreeViewItem tvItem(item, TVIF_TEXT);
     tvItem.pszText = (wxChar *)text.c_str();  // conversion is ok
     DoSetItem(&tvItem);
     wxTreeViewItem tvItem(item, TVIF_TEXT);
     tvItem.pszText = (wxChar *)text.c_str();  // conversion is ok
     DoSetItem(&tvItem);
+
+    // when setting the text of the item being edited, the text control should
+    // be updated to reflect the new text as well, otherwise calling
+    // SetItemText() in the OnBeginLabelEdit() handler doesn't have any effect
+    //
+    // don't use GetEditControl() here because m_textCtrl is not set yet
+    HWND hwndEdit = TreeView_GetEditControl(GetHwnd());
+    if ( hwndEdit )
+    {
+        if ( item == GetSelection() )
+        {
+            ::SetWindowText(hwndEdit, text);
+        }
+    }
 }
 
 int wxTreeCtrl::DoGetItemImageFromData(const wxTreeItemId& item,
 }
 
 int wxTreeCtrl::DoGetItemImageFromData(const wxTreeItemId& item,
@@ -1761,7 +1775,7 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
     }
 }
 
     }
 }
 
-wxTextCtrlwxTreeCtrl::GetEditControl() const
+wxTextCtrl *wxTreeCtrl::GetEditControl() const
 {
     return m_textCtrl;
 }
 {
     return m_textCtrl;
 }
@@ -1976,6 +1990,21 @@ long wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 
         switch ( nMsg )
         {
 
         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))
+                {
+                    UnselectAll();
+                }
+
+                // select item and set the focus to the
+                // newly selected item
+                ::SelectItem(GetHwnd(), htItem);
+                ::SetFocus(GetHwnd(), htItem);
+                break;
+
 #if !wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE
             case WM_LBUTTONDOWN:
                 if ( htItem && isMultiple )
 #if !wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE
             case WM_LBUTTONDOWN:
                 if ( htItem && isMultiple )
@@ -2199,6 +2228,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
 
                 event.m_item = (WXHTREEITEM) info->item.hItem;
                 event.m_label = info->item.pszText;
 
                 event.m_item = (WXHTREEITEM) info->item.hItem;
                 event.m_label = info->item.pszText;
+                event.m_editCancelled = FALSE;
             }
             break;
 
             }
             break;
 
@@ -2225,7 +2255,13 @@ 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)
                 event.m_item = (WXHTREEITEM)info->item.hItem;
                 event.m_label = info->item.pszText;
                 if (info->item.pszText == NULL)
-                    return FALSE;
+                {
+                    event.m_editCancelled = TRUE;
+                }
+                 else
+                {
+                    event.m_editCancelled = FALSE;
+                }
                 break;
             }
 
                 break;
             }
 
@@ -2280,12 +2316,26 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                 eventType = wxEVT_COMMAND_TREE_KEY_DOWN;
                 TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
 
                 eventType = wxEVT_COMMAND_TREE_KEY_DOWN;
                 TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
 
-                // we pass 0 as 2 last CreateKeyEvent() parameters because we
-                // don't have access to the real key press flags here - but as
-                // it is only used to determin wxKeyEvent::m_altDown flag it's
-                // not too bad
+                // fabricate the lParam and wParam parameters sufficiently
+                // similar to the ones from a "real" WM_KEYDOWN so that
+                // CreateKeyEvent() works correctly
+                WXLPARAM lParam =
+                    (::GetKeyState(VK_MENU) & 0x100 ? KF_ALTDOWN : 0) << 16;
+
+                WXWPARAM wParam = info->wVKey;
+
+                int keyCode = wxCharCodeMSWToWX(info->wVKey);
+                if ( !keyCode )
+                {
+                    // wxCharCodeMSWToWX() returns 0 to indicate that this is a
+                    // simple ASCII key
+                    keyCode = wParam;
+                }
+
                 event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN,
                 event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN,
-                                                wxCharCodeMSWToWX(info->wVKey));
+                                                keyCode,
+                                                lParam,
+                                                wParam);
 
                 // a separate event for Space/Return
                 if ( !wxIsCtrlDown() && !wxIsShiftDown() &&
 
                 // a separate event for Space/Return
                 if ( !wxIsCtrlDown() && !wxIsShiftDown() &&
@@ -2349,17 +2399,16 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                             }
 
                             HFONT hFont;
                             }
 
                             HFONT hFont;
-                            wxColour colText, colBack;
                             if ( attr->HasFont() )
                             {
                             if ( attr->HasFont() )
                             {
-                                wxFont font = attr->GetFont();
-                                hFont = (HFONT)font.GetResourceHandle();
+                                hFont = GetHfontOf(attr->GetFont());
                             }
                             else
                             {
                                 hFont = 0;
                             }
 
                             }
                             else
                             {
                                 hFont = 0;
                             }
 
+                            wxColour colText;
                             if ( attr->HasTextColour() )
                             {
                                 colText = attr->GetTextColour();
                             if ( attr->HasTextColour() )
                             {
                                 colText = attr->GetTextColour();
@@ -2372,16 +2421,14 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                             // selection colours should override ours
                             if ( nmcd.uItemState & CDIS_SELECTED )
                             {
                             // selection colours should override ours
                             if ( nmcd.uItemState & CDIS_SELECTED )
                             {
-                                DWORD clrBk = ::GetSysColor(COLOR_HIGHLIGHT);
-                                lptvcd->clrTextBk = clrBk;
-
-                                // try to make the text visible
-                                lptvcd->clrText = wxColourToRGB(colText);
-                                lptvcd->clrText |= ~clrBk;
-                                lptvcd->clrText &= 0x00ffffff;
+                                lptvcd->clrTextBk =
+                                    ::GetSysColor(COLOR_HIGHLIGHT);
+                                lptvcd->clrText =
+                                    ::GetSysColor(COLOR_HIGHLIGHTTEXT);
                             }
                             }
-                            else
+                            else // !selected
                             {
                             {
+                                wxColour colBack;
                                 if ( attr->HasBackgroundColour() )
                                 {
                                     colBack = attr->GetBackgroundColour();
                                 if ( attr->HasBackgroundColour() )
                                 {
                                     colBack = attr->GetBackgroundColour();
@@ -2558,16 +2605,13 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
             // an image depending on the expanded/collapsed state - bug in
             // comctl32.dll or our code?
             {
             // an image depending on the expanded/collapsed state - bug in
             // comctl32.dll or our code?
             {
-                NM_TREEVIEW* tv = (NM_TREEVIEW*)lParam;
-                if ( tv->action == TVE_EXPAND )
-                {
-                    wxTreeItemId id = (WXHTREEITEM)tv->itemNew.hItem;
+                NM_TREEVIEW* tv = (NM_TREEVIEW *)lParam;
+                wxTreeItemId id = (WXHTREEITEM)tv->itemNew.hItem;
 
 
-                    int image = GetItemImage(id, wxTreeItemIcon_Expanded);
-                    if ( image != -1 )
-                    {
-                        RefreshItem(id);
-                    }
+                int image = GetItemImage(id, wxTreeItemIcon_Expanded);
+                if ( image != -1 )
+                {
+                    RefreshItem(id);
                 }
             }
             break;
                 }
             }
             break;
@@ -2575,7 +2619,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
         case TVN_GETDISPINFO:
             // NB: so far the user can't set the image himself anyhow, so do it
             //     anyway - but this may change later
         case TVN_GETDISPINFO:
             // NB: so far the user can't set the image himself anyhow, so do it
             //     anyway - but this may change later
-//          if ( /* !processed && */ 1 )
+            //if ( /* !processed && */ 1 )
             {
                 wxTreeItemId item = event.m_item;
                 TV_DISPINFO *info = (TV_DISPINFO *)lParam;
             {
                 wxTreeItemId item = event.m_item;
                 TV_DISPINFO *info = (TV_DISPINFO *)lParam;