X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4b64104c80391e1fd7d3fb0ee81c13b812f3675..a4314b7e4865907dafdc1402ca767c5287614015:/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp diff --git a/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp b/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp index c178ad47eb..2d07d6b2d3 100644 --- a/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp +++ b/wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp @@ -19,10 +19,6 @@ // headers // --------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(__APPLE__) - #pragma implementation "treelistctrl.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -116,7 +112,7 @@ class wxTreeListHeaderWindow : public wxWindow { protected: wxTreeListMainWindow *m_owner; - wxCursor *m_currentCursor; + const wxCursor *m_currentCursor; wxCursor *m_resizeCursor; bool m_isDragging; @@ -572,6 +568,8 @@ public: // implementation helpers void SendDeleteEvent(wxTreeListItem *itemBeingDeleted); + void DoDirtyProcessing(); + void DrawBorder(const wxTreeItemId& item); void DrawLine(const wxTreeItemId& item, bool below); @@ -1074,7 +1072,7 @@ void wxTreeListTextCtrl::OnKillFocus( wxFocusEvent &event ) // wxTreeListHeaderWindow //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTreeListHeaderWindow,wxWindow); +IMPLEMENT_DYNAMIC_CLASS(wxTreeListHeaderWindow,wxWindow) BEGIN_EVENT_TABLE(wxTreeListHeaderWindow,wxWindow) EVT_ERASE_BACKGROUND (wxTreeListHeaderWindow::OnEraseBackground) @@ -1113,7 +1111,7 @@ wxTreeListHeaderWindow::wxTreeListHeaderWindow( wxWindow *win, m_owner = owner; m_resizeCursor = new wxCursor(wxCURSOR_SIZEWE); - SetBackgroundColour(wxSystemSettings::GetSystemColour( + SetBackgroundColour(wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE)); } @@ -1128,7 +1126,7 @@ void wxTreeListHeaderWindow::DoDrawRect( wxDC *dc, int x, int y, int w, int h ) GtkStateType state = m_parent->IsEnabled() ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE; - x = dc->XLOG2DEV( x ); + x = dc->LogicalToDeviceX( x ); gtk_paint_box (m_wxwindow->style, GTK_PIZZA(m_wxwindow)->bin_window, state, GTK_SHADOW_OUT, @@ -1139,7 +1137,7 @@ void wxTreeListHeaderWindow::DoDrawRect( wxDC *dc, int x, int y, int w, int h ) dc->SetBrush( *wxTRANSPARENT_BRUSH ); - dc->SetPen( wxPen(wxSystemSettings::GetSystemColour( + dc->SetPen( wxPen(wxSystemSettings::GetColour( wxSYS_COLOUR_BTNSHADOW), 1, wxSOLID)); dc->DrawLine( x+w-m_corner+1, y, x+w, y+h ); // right (outer) dc->DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer) @@ -1164,7 +1162,7 @@ void wxTreeListHeaderWindow::DoDrawRect( wxDC *dc, int x, int y, int w, int h ) dc->DrawLine( x+w-m_corner+1, y, x+w, y+h ); // right (outer) dc->DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer) - wxPen pen(wxSystemSettings::GetSystemColour( + wxPen pen(wxSystemSettings::GetColour( wxSYS_COLOUR_BTNSHADOW ), 1, wxSOLID); dc->SetPen( pen ); @@ -1201,26 +1199,21 @@ void wxTreeListHeaderWindow::OnEraseBackground( wxEraseEvent& event ) void wxTreeListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { #ifdef __WXGTK__ - wxClientDC real_dc( this ); + wxClientDC dc( this ); #else - wxPaintDC real_dc( this ); + wxPaintDC dc( this ); #endif - AdjustDC( real_dc ); + AdjustDC( dc ); // width and height of the entire header window int w, h; GetClientSize( &w, &h ); m_owner->CalcUnscrolledPosition(w, 0, &w, NULL); - // Setup double buffering to eliminate the flicker - wxMemoryDC dc; - wxBitmap buffer(w, h); - dc.SelectObject(buffer); dc.SetBackground(wxBrush(GetBackgroundColour())); dc.Clear(); - dc.BeginDrawing(); dc.SetFont( GetFont() ); dc.SetBackgroundMode(wxTRANSPARENT); @@ -1228,7 +1221,7 @@ void wxTreeListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // function to set it separately //dc.SetTextForeground( *wxBLACK ); dc.SetTextForeground(wxSystemSettings:: - GetSystemColour( wxSYS_COLOUR_WINDOWTEXT )); + GetColour( wxSYS_COLOUR_WINDOWTEXT )); int x = HEADER_OFFSET_X; @@ -1309,11 +1302,6 @@ void wxTreeListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) this, dc, wxRect(x, HEADER_OFFSET_Y, more_w, h-2), m_parent->IsEnabled() ? 0 : wxCONTROL_DISABLED); } - - // Finish up by drawing the buffer to the real dc - dc.EndDrawing(); - dc.SelectObject(wxNullBitmap); - real_dc.DrawBitmap(buffer, 0, 0, false); } void wxTreeListHeaderWindow::DrawCurrent() @@ -1398,7 +1386,7 @@ void wxTreeListHeaderWindow::OnMouse( wxMouseEvent &event ) // end of the current column int xpos = 0; - // find the column where this event occured + // find the column where this event occurred int countCol = GetColumnCount(); for (int col = 0; col < countCol; col++) { @@ -1859,7 +1847,7 @@ void wxTreeListMainWindow::Init() m_hilightBrush = new wxBrush ( - wxSystemSettings::GetSystemColour + wxSystemSettings::GetColour ( wxSYS_COLOUR_HIGHLIGHT ), @@ -1868,7 +1856,7 @@ void wxTreeListMainWindow::Init() m_hilightUnfocusedBrush = new wxBrush ( - wxSystemSettings::GetSystemColour + wxSystemSettings::GetColour ( wxSYS_COLOUR_BTNSHADOW ), @@ -1891,7 +1879,7 @@ void wxTreeListMainWindow::Init() m_underMouse = NULL; -#if defined( __WXMAC__ ) && defined(__WXMAC_CARBON__) +#ifdef __WXMAC_CARBON__ m_normalFont.MacCreateThemeFont( kThemeViewsFont ) ; #else m_normalFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); @@ -1936,7 +1924,7 @@ bool wxTreeListMainWindow::Create(wxTreeListCtrl *parent, SetValidator( validator ); #endif - SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_LISTBOX ) ); + SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ) ); #ifdef __WXMSW__ { @@ -2463,7 +2451,7 @@ wxTreeItemId wxTreeListMainWindow::DoInsertItem(const wxTreeItemId& parentId, if ( data != NULL ) { - data->SetId((long)item); + data->SetId((void*)item); } parent->Insert( item, previous ); @@ -2500,7 +2488,7 @@ wxTreeItemId wxTreeListMainWindow::AddRoot(const wxString& text, #endif if ( data != NULL ) { - data->SetId((long)m_anchor); + data->SetId((void*)m_anchor); } if (!HasFlag(wxTR_MULTIPLE)) @@ -2575,7 +2563,7 @@ wxTreeItemId wxTreeListMainWindow::AppendItem(const wxTreeItemId& parentId, void wxTreeListMainWindow::SendDeleteEvent(wxTreeListItem *item) { wxTreeEvent event( wxEVT_COMMAND_TREE_DELETE_ITEM, m_owner->GetId() ); - event.SetItem((long) item); + event.SetItem((void*)item); event.SetEventObject( /*this*/m_owner ); m_owner->ProcessEvent( event ); } @@ -2652,7 +2640,7 @@ void wxTreeListMainWindow::Expand(const wxTreeItemId& itemId) return; wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_EXPANDING, m_owner->GetId() ); - event.SetItem( (long) item ); + event.SetItem( (void*)item ); event.SetEventObject( /*this*/m_owner ); if ( m_owner->ProcessEvent( event ) && !event.IsAllowed() ) @@ -2698,7 +2686,7 @@ void wxTreeListMainWindow::Collapse(const wxTreeItemId& itemId) return; wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, m_owner->GetId() ); - event.SetItem( (long) item ); + event.SetItem( (void*)item ); event.SetEventObject( /*this*/m_owner ); if ( m_owner->ProcessEvent( event ) && !event.IsAllowed() ) { @@ -2876,8 +2864,8 @@ void wxTreeListMainWindow::SelectItem(const wxTreeItemId& itemId, } wxTreeEvent event( wxEVT_COMMAND_TREE_SEL_CHANGING, m_owner->GetId() ); - event.SetItem( (long) item ); - event.SetOldItem( (long) m_current ); + event.SetItem( (void*)item ); + event.SetOldItem( (void*)m_current ); event.SetEventObject( /*this*/m_owner ); // TODO : Here we don't send any selection mode yet ! @@ -2932,11 +2920,11 @@ void wxTreeListMainWindow::SelectItem(const wxTreeItemId& itemId, void wxTreeListMainWindow::SelectAll(bool extended_select) { - wxCHECK_RET( GetWindowStyleFlag() & wxTR_MULTIPLE, wxT("invalid tree style") ); + wxCHECK_RET( GetWindowStyleFlag() & wxTR_MULTIPLE, wxT("invalid tree style, must have wxTR_MULTIPLE style to select all items") ); wxTreeEvent event( wxEVT_COMMAND_TREE_SEL_CHANGING, m_owner->GetId() ); event.SetItem( GetRootItem() ); - event.SetOldItem( (long) m_current ); + event.SetOldItem( (void*) m_current ); event.SetEventObject( /*this*/m_owner ); // TODO : Here we don't send any selection mode yet ! @@ -2960,6 +2948,7 @@ void wxTreeListMainWindow::SelectAll(bool extended_select) wxTreeItemId root = GetRootItem(); wxTreeListItem *first = (wxTreeListItem *)GetFirstChild (root, cookie).m_pItem; wxTreeListItem *last = (wxTreeListItem *)GetLastChild (GetRootItem()).m_pItem; + if (!first || !last) return; if (TagAllChildrenUntilLast (first, last, true)) return; TagNextChildren (first, last, true); @@ -3021,7 +3010,8 @@ void wxTreeListMainWindow::ScrollTo(const wxTreeItemId &item) // We have to call this here because the label in // question might just have been added and no screen // update taken place. - if (m_dirty) wxYieldIfNeeded(); + if (m_dirty) + DoDirtyProcessing(); wxTreeListItem *gitem = (wxTreeListItem*) item.m_pItem; @@ -3314,7 +3304,7 @@ void wxTreeListMainWindow::PaintItem(wxTreeListItem *item, wxDC& dc) if (item->IsSelected() && HasFlag(wxTR_FULL_ROW_HIGHLIGHT)) { dc.SetBrush(*(m_hasFocus ? m_hilightBrush : m_hilightUnfocusedBrush)); dc.SetPen(*wxBLACK_PEN); - colText = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHTTEXT); + colText = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); } else { wxColour colBg; if (attr && attr->HasBackgroundColour()) { @@ -3380,7 +3370,7 @@ void wxTreeListMainWindow::PaintItem(wxTreeListItem *item, wxDC& dc) int width = wxMin(text_w+2, colwidth - text_x - x_colstart); dc.DrawRectangle(text_x-1, item->GetY() + offset, width, total_h-offset); dc.SetBackgroundMode(wxTRANSPARENT); - dc.SetTextForeground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); }else{ dc.SetTextForeground(colText); } @@ -3455,8 +3445,8 @@ void wxTreeListMainWindow::PaintLevel (wxTreeListItem *item, wxDC &dc, int total_width = m_owner->GetHeaderWindow()->GetWidth(); // if the background colour is white, choose a // contrasting color for the lines - dc.SetPen (*((GetBackgroundColour() == *wxWHITE)? - wxMEDIUM_GREY_PEN : wxWHITE_PEN)); + dc.SetPen(((GetBackgroundColour() == *wxWHITE) ? + wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT) : *wxWHITE_PEN)); dc.DrawLine(0, y_top, total_width, y_top); dc.DrawLine(0, y, total_width, y); } @@ -3801,7 +3791,7 @@ void wxTreeListMainWindow::OnChar( wxKeyEvent &event ) { wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, m_owner->GetId() ); - event.SetItem( (long) m_current); + event.SetItem( (void*) m_current); event.SetEventObject( /*this*/m_owner ); m_owner->GetEventHandler()->ProcessEvent( event ); } @@ -4072,7 +4062,7 @@ void wxTreeListMainWindow::Edit( const wxTreeItemId& item ) m_currentEdit = (wxTreeListItem*) item.m_pItem; wxTreeEvent te( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, m_owner->GetId() ); - te.SetItem( (long) m_currentEdit); + te.SetItem( (void*) m_currentEdit); te.SetEventObject( /*this*/m_owner ); m_owner->GetEventHandler()->ProcessEvent( te ); @@ -4081,7 +4071,8 @@ void wxTreeListMainWindow::Edit( const wxTreeItemId& item ) // We have to call this here because the label in // question might just have been added and no screen // update taken place. - if (m_dirty) wxYieldIfNeeded(); + if (m_dirty) + DoDirtyProcessing(); wxString s = m_currentEdit->GetText(/*ALB*/m_main_column); int x = m_currentEdit->GetX() + m_imgWidth2; @@ -4113,7 +4104,7 @@ void wxTreeListMainWindow::OnRenameAccept() { // TODO if the validator fails this causes a crash wxTreeEvent le( wxEVT_COMMAND_TREE_END_LABEL_EDIT, m_owner->GetId() ); - le.SetItem( (long) m_currentEdit ); + le.SetItem( (void*)m_currentEdit ); le.SetEventObject( /*this*/m_owner ); le.SetLabel( m_renameRes ); m_owner->GetEventHandler()->ProcessEvent( le ); @@ -4133,6 +4124,9 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) int flags = 0; wxTreeListItem *item = m_anchor->HitTest(pt, this, flags, 0); wxTreeListItem *underMouse = item; +#if wxUSE_TOOLTIPS + bool underMouseChanged = (underMouse != m_underMouse) ; +#endif // wxUSE_TOOLTIPS if (underMouse && (flags & wxTREE_HITTEST_ONITEMBUTTON) && !event.LeftIsDown() && !m_isDragging && @@ -4159,6 +4153,25 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) RefreshLine( m_underMouse ); } +#if wxUSE_TOOLTIPS + // Determines what item we are hovering over and need a tooltip for + wxTreeItemId hoverItem = item; + + // We do not want a tooltip if we are dragging, or if the rename timer is running + if (underMouseChanged && hoverItem.IsOk() && !m_isDragging && (!m_renameTimer || !m_renameTimer->IsRunning())) + { + // Ask the tree control what tooltip (if any) should be shown + wxTreeEvent hevent(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, GetId()); + hevent.SetItem(hoverItem); + hevent.SetEventObject(this); + + if ( GetEventHandler()->ProcessEvent(hevent) && hevent.IsAllowed() ) + { + SetToolTip(hevent.GetLabel()); + } + } +#endif + // we process left mouse up event (enables in-place edit), right down // (pass to the user code), left dbl click (activate item) and // dragging/moving events for items drag-and-drop @@ -4201,8 +4214,9 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) : wxEVT_COMMAND_TREE_BEGIN_DRAG; wxTreeEvent nevent( command,/*ALB*/ m_owner->GetId() ); - nevent.SetItem( (long) m_current); + nevent.SetItem( (void*)m_current); nevent.SetEventObject(/*this*/m_owner); // ALB + nevent.SetPoint(pt); // by default the dragging is not supported, the user code must // explicitly allow the event for it to take place @@ -4245,7 +4259,7 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) // highlight the current drop target if any DrawDropEffect(m_dropTarget); - wxYieldIfNeeded(); + DoDirtyProcessing(); } } else if ( (event.LeftUp() || event.RightUp()) && m_isDragging ) @@ -4263,7 +4277,7 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) // generate the drag end event wxTreeEvent event(wxEVT_COMMAND_TREE_END_DRAG,/*ALB*/m_owner->GetId()); - event.SetItem( (long) item ); + event.SetItem( (void*)item ); event.SetPoint( wxPoint(x, y) ); event.SetEventObject(/*this*/m_owner); @@ -4276,7 +4290,7 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) SetCursor(m_oldCursor); - wxYieldIfNeeded(); + DoDirtyProcessing(); } else { @@ -4291,7 +4305,7 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) SetFocus(); wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, m_owner->GetId()); - nevent.SetItem( (long) item ); + nevent.SetItem( (void*)item ); int nx, ny; CalcScrolledPosition(x, y, &nx, &ny); nevent.SetPoint( wxPoint(nx, ny)); @@ -4358,7 +4372,7 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) // send activate event first wxTreeEvent nevent( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, m_owner->GetId() ); - nevent.SetItem( (long) item ); + nevent.SetItem( (void*)item ); int nx, ny; CalcScrolledPosition(x, y, &nx, &ny); nevent.SetPoint( wxPoint(nx, ny) ); @@ -4379,6 +4393,11 @@ void wxTreeListMainWindow::OnMouse( wxMouseEvent &event ) } void wxTreeListMainWindow::OnIdle( wxIdleEvent &WXUNUSED(event) ) +{ + DoDirtyProcessing(); +} + +void wxTreeListMainWindow::DoDirtyProcessing() { /* after all changes have been done to the tree control, * we actually redraw the tree when everything is over */ @@ -4606,10 +4625,11 @@ void wxTreeListMainWindow::SetFocus() // wxTreeListCtrl //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTreeListCtrl, wxControl); +IMPLEMENT_DYNAMIC_CLASS(wxTreeListCtrl, wxControl) BEGIN_EVENT_TABLE(wxTreeListCtrl, wxControl) EVT_SIZE(wxTreeListCtrl::OnSize) + EVT_TREE_ITEM_GETTOOLTIP(wxID_ANY, wxTreeListCtrl::OnGetToolTip) END_EVENT_TABLE(); bool wxTreeListCtrl::Create(wxWindow *parent, wxWindowID id, @@ -4653,8 +4673,7 @@ void wxTreeListCtrl::CalculateAndSetHeaderHeight() } } - -void wxTreeListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +void wxTreeListCtrl::DoHeaderLayout() { int w, h; GetClientSize(&w, &h); @@ -4665,6 +4684,11 @@ void wxTreeListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) } if (m_main_win) m_main_win->SetSize(0, m_headerHeight + 1, w, h - m_headerHeight - 1); +} + +void wxTreeListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + DoHeaderLayout(); } @@ -5015,7 +5039,10 @@ wxString wxTreeListCtrl::GetColumnText(size_t column) const { return m_header_win->GetColumnText(column); } void wxTreeListCtrl::AddColumn(const wxTreeListColumnInfo& col) -{ m_header_win->AddColumn(col); } +{ + m_header_win->AddColumn(col); + DoHeaderLayout(); +} void wxTreeListCtrl::InsertColumn(size_t before, const wxTreeListColumnInfo& col) @@ -5081,3 +5108,11 @@ wxSize wxTreeListCtrl::DoGetBestSize() const // something is better than nothing... return wxSize(100,80); } + +// Process the tooltip event, to speed up event processing. +// Doesn't actually get a tooltip. +void wxTreeListCtrl::OnGetToolTip( wxTreeEvent &event ) +{ + event.Veto(); +} +