X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/309bd665c44bc33b8da7749e81e7b7b3ec18117a..9a958328220b25226d259e43791eee4b06fe86ef:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 86f1fe9550..5d80ef9d13 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -138,12 +138,16 @@ public: // the column count virtual void UpdateDisplay(); + virtual void OnInternalIdle(); + // called Refresh afterwards virtual void ScrollWindow(int dx, int dy, const wxRect *rect = NULL); + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + protected: virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); - + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags); wxSize DoGetBestSize() const; @@ -152,9 +156,10 @@ protected: wxDataViewColumn *GetColumnFromHeader(NMHEADER *nmHDR) { return GetColumn(GetColumnIdxFromHeader(nmHDR)); } - - int m_scrollOffsetX; - int m_buttonHeight; + + int m_scrollOffsetX; + int m_buttonHeight; + bool m_delayedUpdate; private: DECLARE_DYNAMIC_CLASS(wxDataViewHeaderWindowMSW) @@ -743,7 +748,7 @@ bool wxDataViewTextRendererAttr::Render( wxRect cell, wxDC *dc, int WXUNUSED(sta colour = dc->GetTextForeground(); dc->SetTextForeground( m_attr.GetColour() ); } - + if (m_attr.GetBold() || m_attr.GetItalic()) { font = dc->GetFont(); @@ -755,22 +760,22 @@ bool wxDataViewTextRendererAttr::Render( wxRect cell, wxDC *dc, int WXUNUSED(sta dc->SetFont( myfont ); } } - + dc->DrawText( m_text, cell.x, cell.y + ((cell.height - dc->GetCharHeight()) / 2)); - + // restore dc if (m_hasAttr) { if (m_attr.HasColour()) dc->SetTextForeground( colour ); - + if (m_attr.GetBold() || m_attr.GetItalic()) dc->SetFont( font ); } - + return true; } - + // --------------------------------------------------------- // wxDataViewBitmapRenderer @@ -1279,23 +1284,26 @@ bool wxDataViewHeaderWindowMSW::Create( wxDataViewCtrl *parent, wxWindowID id, m_owner = parent; m_scrollOffsetX = 0; - m_buttonHeight = wxRendererNative::Get().GetHeaderButtonHeight( this ) + 10; + m_delayedUpdate = false; + m_buttonHeight = wxRendererNative::Get().GetHeaderButtonHeight( this ); int x = pos.x == wxDefaultCoord ? 0 : pos.x, y = pos.y == wxDefaultCoord ? 0 : pos.y, w = size.x == wxDefaultCoord ? 1 : size.x, - h = size.y == wxDefaultCoord ? m_buttonHeight : size.y; + h = m_buttonHeight; + + wxSize new_size(w,h); - if ( !CreateControl(parent, id, pos, size, 0, wxDefaultValidator, name) ) + if ( !CreateControl(parent, id, pos, new_size, 0, wxDefaultValidator, name) ) return false; // create the native WC_HEADER window: WXHWND hwndParent = (HWND)parent->GetHandle(); WXDWORD msStyle = WS_CHILD | HDS_DRAGDROP | HDS_BUTTONS | HDS_HORZ | HDS_HOTTRACK | HDS_FULLDRAG; - + if ( m_isShown ) msStyle |= WS_VISIBLE; - + m_hWnd = CreateWindowEx(0, WC_HEADER, (LPCTSTR) NULL, @@ -1318,7 +1326,7 @@ bool wxDataViewHeaderWindowMSW::Create( wxDataViewCtrl *parent, wxWindowID id, // the following is required to get the default win's font for // header windows and must be done befor sending the HDM_LAYOUT msg SetFont(GetFont()); - + return true; } @@ -1329,7 +1337,16 @@ wxDataViewHeaderWindowMSW::~wxDataViewHeaderWindow() wxSize wxDataViewHeaderWindowMSW::DoGetBestSize() const { - return wxSize(80, m_buttonHeight ); + return wxSize( 80, m_buttonHeight+2 ); +} + +void wxDataViewHeaderWindowMSW::OnInternalIdle() +{ + if (m_delayedUpdate) + { + m_delayedUpdate = false; + UpdateDisplay(); + } } void wxDataViewHeaderWindowMSW::UpdateDisplay() @@ -1452,10 +1469,13 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA case HDN_ENDDRAG: // user has finished reordering a column { - // TODO: How to query the new position here? + wxDataViewColumn *col = GetColumn(nmHDR->iItem); + unsigned int new_pos = nmHDR->pitem->iOrder; + m_owner->ColumnMoved( col, new_pos ); + m_delayedUpdate = true; } break; - + case HDN_ITEMCHANGING: if (nmHDR->pitem != NULL && (nmHDR->pitem->mask & HDI_WIDTH) != 0) @@ -1579,7 +1599,7 @@ void wxDataViewHeaderWindowMSW::ScrollWindow(int dx, int WXUNUSED(dy), const wxRect * WXUNUSED(rect)) { m_scrollOffsetX += dx; - + GetParent()->Layout(); } @@ -1944,6 +1964,8 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i SetBackgroundColour( *wxWHITE ); + SetBackgroundStyle(wxBG_STYLE_CUSTOM); + m_penRule = wxPen(GetRuleColour(), 1, wxSOLID); //Here I compose a pen can draw black lines, maybe there are something system colour to use @@ -2110,7 +2132,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxVariant value; wxDataViewTreeNode *node = NULL; wxDataViewItem dataitem; - + if (m_root) { node = GetTreeNodeByRow(item); @@ -2129,7 +2151,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) model->GetValue( value, dataitem, col->GetModelColumn()); cell->SetValue( value ); - + if (cell->GetWantsAttr()) { wxDataViewItemAttr attr; @@ -2147,7 +2169,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) if ((m_root) && (col == expander)) { indent = node->GetIndentLevel(); - + //Calculate the indent first indent = cell_rect.x + GetOwner()->GetIndent() * indent; @@ -2175,7 +2197,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // I am wondering whether we should draw dot lines between tree nodes if (node) delete node; - // Yes, if the node does not have any child, it must be a leaf which + // Yes, if the node does not have any child, it must be a leaf which // mean that it is a temporarily created by GetTreeNodeByRow } @@ -2344,7 +2366,7 @@ bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxData UpdateDisplay(); return true; } - + SortPrepare(); wxDataViewTreeNode * node; @@ -2385,7 +2407,7 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, m_currentRow = m_count - 1; m_selection.Empty(); - + UpdateDisplay(); return true; @@ -2497,10 +2519,10 @@ bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned i bool wxDataViewMainWindow::Cleared() { DestroyTree(); - + SortPrepare(); BuildTree( GetOwner()->GetModel() ); - + UpdateDisplay(); return true; @@ -3894,7 +3916,7 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model ) model->AddNotifier( m_notifier ); m_clientArea->DestroyTree(); - + m_clientArea->BuildTree(model); m_clientArea->UpdateDisplay(); @@ -3961,6 +3983,15 @@ wxDataViewColumn* wxDataViewCtrl::GetColumn( unsigned int pos ) const return NULL; } +void wxDataViewCtrl::ColumnMoved( wxDataViewColumn* col, unsigned int new_pos ) +{ + if (new_pos > m_cols.GetCount()) return; + m_cols.DeleteObject( col ); + m_cols.Insert( new_pos, col ); + + m_clientArea->UpdateDisplay(); +} + bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column ) { wxDataViewColumnList::compatibility_iterator ret = m_cols.Find( column );