X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/668674c1e2301c2bc946c3fe3936599fd269d4fe..75595b9750de618c1ccc6356159aad0918bc4786:/src/generic/treectlg.cpp diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 393231673c..c744c68ec1 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -541,7 +541,7 @@ void wxTreeTextCtrl::OnKeyUp( wxKeyEvent &event ) wxPoint myPos = GetPosition(); wxSize mySize = GetSize(); int sx, sy; - GetTextExtent(GetValue() + _T("M"), &sx, &sy); + GetTextExtent(GetValue() + wxT("M"), &sx, &sy); if (myPos.x + sx > parentSize.x) sx = parentSize.x - myPos.x; if (mySize.x > sx) @@ -973,21 +973,11 @@ void wxGenericTreeCtrl::Init() m_lastOnSame = false; #if defined( __WXMAC__ ) -#if wxOSX_USE_ATSU_TEXT - m_normalFont.MacCreateFromThemeFont( kThemeViewsFont ) ; -#else - m_normalFont.MacCreateFromUIFont( kCTFontViewsFontType ) ; -#endif + m_normalFont = wxFont(wxOSX_SYSTEM_FONT_VIEWS); #else m_normalFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); #endif - m_boldFont = wxFont(m_normalFont.GetPointSize(), - m_normalFont.GetFamily(), - m_normalFont.GetStyle(), - wxBOLD, - m_normalFont.GetUnderlined(), - m_normalFont.GetFaceName(), - m_normalFont.GetEncoding()); + m_boldFont = m_normalFont.Bold(); } bool wxGenericTreeCtrl::Create(wxWindow *parent, @@ -1004,8 +994,16 @@ bool wxGenericTreeCtrl::Create(wxWindow *parent, if (major < 10) style |= wxTR_ROW_LINES; + + if (style & wxTR_HAS_BUTTONS) + style |= wxTR_NO_LINES; #endif // __WXMAC__ +#ifdef __WXGTK20__ + if (style & wxTR_HAS_BUTTONS) + style |= wxTR_NO_LINES; +#endif + if ( !wxControl::Create( parent, id, pos, size, style|wxHSCROLL|wxVSCROLL, validator, @@ -1294,14 +1292,8 @@ bool wxGenericTreeCtrl::SetFont( const wxFont &font ) { wxTreeCtrlBase::SetFont(font); - m_normalFont = font ; - m_boldFont = wxFont(m_normalFont.GetPointSize(), - m_normalFont.GetFamily(), - m_normalFont.GetStyle(), - wxBOLD, - m_normalFont.GetUnderlined(), - m_normalFont.GetFaceName(), - m_normalFont.GetEncoding()); + m_normalFont = font; + m_boldFont = m_normalFont.Bold(); if (m_anchor) m_anchor->RecursiveResetTextSize(); @@ -1775,7 +1767,7 @@ void wxGenericTreeCtrl::Delete(const wxTreeItemId& itemId) } wxGenericTreeItem *parent = item->GetParent(); - + // if the selected item will be deleted, select the parent ... wxGenericTreeItem *to_be_selected = parent; if (parent) @@ -1850,9 +1842,9 @@ void wxGenericTreeCtrl::Expand(const wxTreeItemId& itemId) { wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; - wxCHECK_RET( item, _T("invalid item in wxGenericTreeCtrl::Expand") ); + wxCHECK_RET( item, wxT("invalid item in wxGenericTreeCtrl::Expand") ); wxCHECK_RET( !HasFlag(wxTR_HIDE_ROOT) || itemId != GetRootItem(), - _T("can't expand hidden root") ); + wxT("can't expand hidden root") ); if ( !item->HasPlus() ) return; @@ -1887,7 +1879,7 @@ void wxGenericTreeCtrl::Expand(const wxTreeItemId& itemId) void wxGenericTreeCtrl::Collapse(const wxTreeItemId& itemId) { wxCHECK_RET( !HasFlag(wxTR_HIDE_ROOT) || itemId != GetRootItem(), - _T("can't collapse hidden root") ); + wxT("can't collapse hidden root") ); wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; @@ -1949,6 +1941,20 @@ void wxGenericTreeCtrl::Unselect() } } +void wxGenericTreeCtrl::ClearFocusedItem() +{ + wxTreeItemId item = GetFocusedItem(); + if ( item.IsOk() ) + SelectItem(item, false); +} + +void wxGenericTreeCtrl::SetFocusedItem(const wxTreeItemId& item) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + SelectItem(item, true); +} + void wxGenericTreeCtrl::UnselectAllChildren(wxGenericTreeItem *item) { if (item->IsSelected()) @@ -1979,6 +1985,42 @@ void wxGenericTreeCtrl::UnselectAll() } } +void wxGenericTreeCtrl::SelectChildren(const wxTreeItemId& parent) +{ + wxCHECK_RET( HasFlag(wxTR_MULTIPLE), + "this only works with multiple selection controls" ); + + UnselectAll(); + + if ( !HasChildren(parent) ) + return; + + + wxArrayGenericTreeItems& + children = ((wxGenericTreeItem*) parent.m_pItem)->GetChildren(); + size_t count = children.GetCount(); + + wxGenericTreeItem * + item = (wxGenericTreeItem*) ((wxTreeItemId)children[0]).m_pItem; + wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); + event.m_itemOld = m_current; + + if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() ) + return; + + for ( size_t n = 0; n < count; ++n ) + { + m_current = m_key_current = children[n]; + m_current->SetHilight(true); + RefreshSelected(); + } + + + event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED); + GetEventHandler()->ProcessEvent( event ); +} + + // Recursive function ! // To stop we must have crt_itemIsSelected() ) + DoSelectItem(itemId, !HasFlag(wxTR_MULTIPLE)); } else // deselect { - wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; - wxCHECK_RET( item, wxT("SelectItem(): invalid tree item") ); - wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() ) return; @@ -2226,61 +2269,42 @@ void wxGenericTreeCtrl::EnsureVisible(const wxTreeItemId& item) void wxGenericTreeCtrl::ScrollTo(const wxTreeItemId &item) { - if (!item.IsOk()) return; + if (!item.IsOk()) + return; - // We have to call this here because the label in - // question might just have been added and no screen - // update taken place. + // update the control before scrolling it if (m_dirty) #if defined( __WXMSW__ ) || defined(__WXMAC__) Update(); #else DoDirtyProcessing(); #endif + wxGenericTreeItem *gitem = (wxGenericTreeItem*) item.m_pItem; - // now scroll to the item - int item_y = gitem->GetY(); + int itemY = gitem->GetY(); int start_x = 0; int start_y = 0; GetViewStart( &start_x, &start_y ); - start_y *= PIXELS_PER_UNIT; - int client_h = 0; - int client_w = 0; - GetClientSize( &client_w, &client_h ); + const int clientHeight = GetClientSize().y; + + const int itemHeight = GetLineHeight(gitem) + 2; - if (item_y < start_y+3) + if ( itemY + itemHeight > start_y*PIXELS_PER_UNIT + clientHeight ) { - // going down - int x = 0; - int y = 0; - m_anchor->GetSize( x, y, this ); - y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - int x_pos = GetScrollPos( wxHORIZONTAL ); - // Item should appear at top - SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, - x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, - x_pos, item_y/PIXELS_PER_UNIT ); + // need to scroll up by enough to show this item fully + itemY += itemHeight - clientHeight; } - else if (item_y+GetLineHeight(gitem) > start_y+client_h) + else if ( itemY > start_y*PIXELS_PER_UNIT ) { - // going up - int x = 0; - int y = 0; - m_anchor->GetSize( x, y, this ); - y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - item_y += PIXELS_PER_UNIT+2; - int x_pos = GetScrollPos( wxHORIZONTAL ); - // Item should appear at bottom - SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, - x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, - x_pos, - (item_y+GetLineHeight(gitem)-client_h)/PIXELS_PER_UNIT ); + // item is already fully visible, don't do anything + return; } + //else: scroll down to make this item the top one displayed + + Scroll(-1, itemY/PIXELS_PER_UNIT); } // FIXME: tree sorting functions are not reentrant and not MT-safe! @@ -3040,6 +3064,21 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) // end : go to last item without opening parents // alnum : start or continue searching for the item with this prefix int keyCode = event.GetKeyCode(); + +#ifdef __WXOSX__ + // Make the keys work as they do in the native control: + // right => expand + // left => collapse if current item is expanded + if (keyCode == WXK_RIGHT) + { + keyCode = '+'; + } + else if (keyCode == WXK_LEFT && IsExpanded(m_current)) + { + keyCode = '-'; + } +#endif // __WXOSX__ + switch ( keyCode ) { case '+': @@ -3370,7 +3409,7 @@ bool wxGenericTreeCtrl::GetBoundingRect(const wxTreeItemId& item, wxTextCtrl *wxGenericTreeCtrl::EditLabel(const wxTreeItemId& item, wxClassInfo * WXUNUSED(textCtrlClass)) { - wxCHECK_MSG( item.IsOk(), NULL, _T("can't edit an invalid item") ); + wxCHECK_MSG( item.IsOk(), NULL, wxT("can't edit an invalid item") ); wxGenericTreeItem *itemEdit = (wxGenericTreeItem *)item.m_pItem; @@ -3410,7 +3449,7 @@ wxTextCtrl* wxGenericTreeCtrl::GetEditControl() const void wxGenericTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool discardChanges) { - wxCHECK_RET( m_textCtrl, _T("not editing label") ); + wxCHECK_RET( m_textCtrl, wxT("not editing label") ); m_textCtrl->EndEdit(discardChanges); }