X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1fded56b375bf7a4687af1cdb182899614c1b2a8..8179a16812e66ff0ac32bb09803e95756350c76c:/wxPython/contrib/gizmos/treelistctrl.cpp diff --git a/wxPython/contrib/gizmos/treelistctrl.cpp b/wxPython/contrib/gizmos/treelistctrl.cpp index a559d95415..b72984d4b8 100644 --- a/wxPython/contrib/gizmos/treelistctrl.cpp +++ b/wxPython/contrib/gizmos/treelistctrl.cpp @@ -1580,7 +1580,7 @@ wxTreeListItem *wxTreeListItem::HitTest(const wxPoint& point, { // evaluate the item int h = theCtrl->GetLineHeight(this); - if ((point.y > m_y) && (point.y < m_y + h)) + if ((point.y > m_y) && (point.y <= m_y + h)) { int y_mid = m_y + h/2; if (point.y < y_mid ) @@ -1646,13 +1646,19 @@ wxTreeListItem *wxTreeListItem::HitTest(const wxPoint& point, const wxTreeListMainWindow *theCtrl, int &flags, int& column, int level) { - column = -1; + column = theCtrl->GetMainColumn(); //-1; wxTreeListItem* res = HitTest(point, theCtrl, flags, level); - if(!res) return res; - if(flags & wxTREE_HITTEST_ONITEMINDENT) { + if (!res) { + column = -1; + return res; + } + + if (point.x >= theCtrl->m_owner->GetHeaderWindow()->GetWidth()) + column = -1; + else if (flags & wxTREE_HITTEST_ONITEMINDENT) { int x = 0; - for(size_t i = 0; i < theCtrl->GetMainColumn(); ++i) { + for (int i = 0; i < column; ++i) { int w = theCtrl->m_owner->GetHeaderWindow()->GetColumnWidth(i); if(point.x >= x && point.x < x+w) { flags ^= wxTREE_HITTEST_ONITEMINDENT; @@ -1660,23 +1666,24 @@ wxTreeListItem *wxTreeListItem::HitTest(const wxPoint& point, column = i; return res; } + x += w; } } - else if(flags & wxTREE_HITTEST_ONITEMRIGHT) { + else if (flags & wxTREE_HITTEST_ONITEMRIGHT) { int x = 0; - size_t i; - for(i = 0; i < theCtrl->GetMainColumn()+1; ++i) { + int i; + for (i = 0; i < column+1; ++i) { x += theCtrl->m_owner->GetHeaderWindow()->GetColumnWidth(i); } - for(i = theCtrl->GetMainColumn()+1; - i < theCtrl->GetColumnCount(); ++i) { + for (i = column+1; i < (int)theCtrl->GetColumnCount(); ++i) { int w = theCtrl->m_owner->GetHeaderWindow()->GetColumnWidth(i); - if(point.x >= x && point.x < x+w) { + if (point.x >= x && point.x < x+w) { flags ^= wxTREE_HITTEST_ONITEMRIGHT; flags |= wxTREE_HITTEST_ONITEMCOLUMN; column = i; return res; } + x += w; } } @@ -2452,51 +2459,115 @@ void wxTreeListMainWindow::SendDeleteEvent(wxTreeListItem *item) m_owner->ProcessEvent( event ); } -inline -void wxTreeListMainWindow::DeleteChildren(const wxTreeItemId& itemId) -{ - m_dirty = TRUE; // do this first so stuff below doesn't cause flicker +// inline +// void wxTreeListMainWindow::DeleteChildren(const wxTreeItemId& itemId) +// { +// m_dirty = TRUE; // do this first so stuff below doesn't cause flicker + +// wxTreeListItem *item = (wxTreeListItem*) itemId.m_pItem; +// item->DeleteChildren(this); +// } + +// inline +// void wxTreeListMainWindow::Delete(const wxTreeItemId& itemId) +// { +// m_dirty = TRUE; // do this first so stuff below doesn't cause flicker + +// wxTreeListItem *item = (wxTreeListItem*) itemId.m_pItem; + +// // don't stay with invalid m_key_current or we will crash in +// // the next call to OnChar() +// bool changeKeyCurrent = FALSE; +// wxTreeListItem *itemKey = m_key_current; +// while ( itemKey ) +// { +// if ( itemKey == item ) +// { +// // m_key_current is a descendant of the item being deleted +// changeKeyCurrent = TRUE; +// break; +// } +// itemKey = itemKey->GetParent(); +// } + +// wxTreeListItem *parent = item->GetParent(); +// if ( parent ) +// { +// parent->GetChildren().Remove( item ); // remove by value +// } + +// if ( changeKeyCurrent ) +// { +// // may be NULL or not +// m_key_current = parent; +// } + +// item->DeleteChildren(this); +// SendDeleteEvent(item); +// delete item; +// } + +// inline +// void wxTreeListMainWindow::DeleteAllItems() +// { +// if ( m_anchor ) +// { +// m_dirty = TRUE; + +// m_anchor->DeleteChildren(this); +// delete m_anchor; + +// m_anchor = NULL; +// } +// } - wxTreeListItem *item = (wxTreeListItem*) itemId.m_pItem; - item->DeleteChildren(this); -} inline -void wxTreeListMainWindow::Delete(const wxTreeItemId& itemId) +void wxTreeListMainWindow::DeleteChildren(const wxTreeItemId& itemId) { m_dirty = TRUE; // do this first so stuff below doesn't cause flicker wxTreeListItem *item = (wxTreeListItem*) itemId.m_pItem; + // mst:16.10.03 + // moved from Delete() // don't stay with invalid m_key_current or we will crash in // the next call to OnChar() - bool changeKeyCurrent = FALSE; wxTreeListItem *itemKey = m_key_current; while ( itemKey ) { if ( itemKey == item ) { - // m_key_current is a descendant of the item being deleted - changeKeyCurrent = TRUE; + // m_key_current is a descendant of the item which childrens being deleted + m_key_current = item; break; } itemKey = itemKey->GetParent(); } + item->DeleteChildren(this); +} + +inline +void wxTreeListMainWindow::Delete(const wxTreeItemId& itemId) +{ + m_dirty = TRUE; // do this first so stuff below doesn't cause flicker + + wxTreeListItem *item = (wxTreeListItem*) itemId.m_pItem; + + // mst:16.10.03 + item->DeleteChildren(this); + wxTreeListItem *parent = item->GetParent(); + if ( parent ) - { - parent->GetChildren().Remove( item ); // remove by value - } + parent->GetChildren().Remove( item ); // remove by value - if ( changeKeyCurrent ) - { - // may be NULL or not - m_key_current = parent; - } + if (m_key_current == item) + m_key_current = parent; - item->DeleteChildren(this); SendDeleteEvent(item); + delete item; } @@ -2507,6 +2578,8 @@ void wxTreeListMainWindow::DeleteAllItems() { m_dirty = TRUE; + m_key_current = NULL; // mst:16.10.03 + m_anchor->DeleteChildren(this); delete m_anchor; @@ -2514,6 +2587,7 @@ void wxTreeListMainWindow::DeleteAllItems() } } + void wxTreeListMainWindow::Expand(const wxTreeItemId& itemId) { wxTreeListItem *item = (wxTreeListItem*) itemId.m_pItem; @@ -3540,7 +3614,7 @@ void wxTreeListMainWindow::OnChar( wxKeyEvent &event ) // right : open if parent and go next (or expand on Win32) // home : go to root // end : go to last item without opening parents - switch (event.KeyCode()) + switch (event.GetKeyCode()) { #ifndef __WXMSW__ // mimic the standard win32 tree ctrl case '+': @@ -3754,6 +3828,7 @@ wxTreeItemId wxTreeListMainWindow::HitTest(const wxPoint& point, int& flags, int w, h; GetSize(&w, &h); flags=0; + column = -1; if (point.x<0) flags |= wxTREE_HITTEST_TOLEFT; if (point.x>w) flags |= wxTREE_HITTEST_TORIGHT; if (point.y<0) flags |= wxTREE_HITTEST_ABOVE; @@ -3766,12 +3841,8 @@ wxTreeItemId wxTreeListMainWindow::HitTest(const wxPoint& point, int& flags, return wxTreeItemId(); } - wxClientDC dc(this); - PrepareDC(dc); - wxCoord x = dc.DeviceToLogicalX( point.x ); - wxCoord y = dc.DeviceToLogicalY( point.y ); - wxTreeListItem *hit = m_anchor->HitTest(wxPoint(x, y), this, flags, - column, 0); + wxTreeListItem *hit = m_anchor->HitTest(CalcUnscrolledPosition(point), + this, flags, column, 0); if (hit == NULL) { flags = wxTREE_HITTEST_NOWHERE; @@ -4253,7 +4324,8 @@ void wxTreeListMainWindow::RefreshSubtree(wxTreeListItem *item) int cw = 0; int ch = 0; - GetClientSize( &cw, &ch ); + //GetClientSize( &cw, &ch ); + GetVirtualSize(&cw, &ch); wxRect rect; rect.x = dc.LogicalToDeviceX( 0 ); @@ -4275,7 +4347,8 @@ void wxTreeListMainWindow::RefreshLine( wxTreeListItem *item ) int cw = 0; int ch = 0; - GetClientSize( &cw, &ch ); + //GetClientSize( &cw, &ch ); + GetVirtualSize(&cw, &ch); wxRect rect; rect.x = dc.LogicalToDeviceX( 0 ); @@ -4661,8 +4734,7 @@ void wxTreeListCtrl::ScrollTo(const wxTreeItemId& item) wxTreeItemId wxTreeListCtrl::HitTest(const wxPoint& pos, int& flags, int& column) { - return m_main_win->HitTest(m_main_win->ScreenToClient(ClientToScreen(pos)), - flags, column); + return m_main_win->HitTest(pos, flags, column); } bool wxTreeListCtrl::GetBoundingRect(const wxTreeItemId& item, wxRect& rect,